首页 > 其他分享 >Net8 Autofac实现依赖注入(构造函数注入、属性注入)

Net8 Autofac实现依赖注入(构造函数注入、属性注入)

时间:2024-02-25 11:11:06浏览次数:16  
标签:IDependency Autofac string builder 注入 public 构造函数

项目以net8建立为例子(net6也通用),使用Autofac实现构造函数注入、属性注入两种。


引用以下package

Autofac
Autofac.Extensions.DependencyInjection
Microsoft.Extensions.DependencyModel

在program下添加autofac

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

创建实现IDependency接口,用于对引用此接口的类进行注册

public interface IDependency
{
}

创建实现AutoRegisterModule

public class AutoRegisterModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        // 自动对集成 IDependency 接口的类进行注册
        Type baseType = typeof(IDependency);
        var compilationLibrary = DependencyContext.Default.CompileLibraries.Where(x => !x.Serviceable && x.Type == "project").ToList();

        List<Assembly> assemblyList = new List<Assembly>();
        foreach (var _compilation in compilationLibrary)
        {
            try
            {
                assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
            }
            catch (Exception ex)
            {
                Console.WriteLine(_compilation.Name + ex.Message);
            }
        }
        builder.RegisterAssemblyTypes(assemblyList.ToArray()).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
            .AsSelf()
            .AsImplementedInterfaces()
            .PropertiesAutowired()
            .InstancePerLifetimeScope();

        var controllersTypesInAssembly = typeof(Program).Assembly.GetExportedTypes()
            .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();

        builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();

    }
}

在program添加:

builder.Host.ConfigureContainer<ContainerBuilder>(i => i.RegisterModule<AutoRegisterModule>());
builder.Services.AddControllers().AddControllersAsServices();

构造函数注入

创建service类及接口

public class TestService3 : ITestService3, IDependency
{
    public string GetString()
    {
        return "test service 3";
    }
}

public interface ITestService3
{
    string GetString();
}

在controller使用:

private readonly ITestService3 _testService3;

public WeatherForecastController(ITestService3 testService3)
{
    _testService3 = testService3;
}

[HttpGet, Route("demo")]
public string GetDemo()
{
    return _testService3.GetString();
}

属性注入

创建service类,不用创建接口也行

public class TestService2 : IDependency
{
    public string GetString()
    {
        return "test service 2";
    }
}

在controller使用:

public TestService2 service2 { get; set; } //不能写成public TestService2 service2; 这只是声明了一个变量,没有没有注入依赖项到属性中

[HttpGet, Route("demo")]
public string GetDemo()
{
    return service2.GetString();
}

标签:IDependency,Autofac,string,builder,注入,public,构造函数
From: https://www.cnblogs.com/hwxing/p/18032167

相关文章

  • C++ 拷贝构造函数简单测试
    浅拷贝静态数组的空间体现深拷贝的效果#include<iostream>#include<string>usingnamespacestd;#defineSEX_SIZE10classStudent{public:Student(stringname){Age=10;Name=newstring(name);strcpy(Sex,"男");......
  • 刘铁猛C#学习笔记21 反射与依赖注入
    反射对于一个现有对象,能够在不使用new操作符、不知道其具体静态类型的情况下,创建出一个同类型的对象,还能访问这个复制品对象拥有的各个成员。相当于进一步的解耦,可以不使用new操作符,就没有类型的依赖关系这样的耦合关系甚至可以弱到忽略不计反射在.NET和JAVA中非常重要 ......
  • Java 构造函数与修饰符详解:初始化对象与控制权限
    Java构造函数Java构造函数是一种特殊的类方法,用于在创建对象时初始化对象的属性。它与类名相同,并且没有返回值类型。构造函数的作用:为对象的属性设置初始值执行必要的初始化操作提供创建对象的多种方式构造函数的类型:默认构造函数:无参数的构造函数,如果用户没有明......
  • Kotlin的主构造函数
    主构造函数没有函数体,如果想在主构造函数中写一些逻辑,Kotlin提供了一个init结构体,所有主构造函数中的逻辑都可以写在里面:classStudent(valsno:String,valgrade:Int):Person(){init{println("snois$sno")println("gradeis$grade")}}......
  • 构造函数和原型
    1.1对象的三种创建方式字面量方式varobj={}; 2.new关键字varobj=newObject();3.构造函数方式functionPerson(name,age){this.name=name;this.age=age;}varobj=newPerson('zs',12);构造函数是一个特殊的函数,用来初始化对象,为对象成员变量......
  • 无列名sql注入
    参考:https://err0r.top/article/mardasctf/https://johnfrod.top/安全/无列名注入绕过information_schema/无列名注入sql注入一般都会用到information_schema这个库(mysql自带的库),所以ban掉这个表是一个很好的防御手段,这时候就可以使用无列名注入来绕过。information_schema库......
  • SQL注入Bypass
    SQL注入Bypass绕过空格/**/注释代替空格%a0<>过滤引号使用hex替代如:selectcoulumn_namefrominformation_schema.columnswheretabel_name='users'selectcoulumn_namefrominformation_schema.columnswheretabel_name=0x7573657273过滤等号将=换为!(<>......
  • 开始学习web-sql注入
    web内容多且杂,不知道怎么下手开始学,那就先从sql注入开始学吧目前只在b站上找了一些课程,还有ctfwiki作为参考链接贴在下面:ctfwikihttps://www.bilibili.com/video/BV1c34y1h7So/?spm_id_from=333.337.search-card.all.click&vd_source=27b6c7c9811379b1cf1a595591fa3086要是能......
  • .Net Core框架容器依赖注入的生命周期
    一.前言框架中依赖注入容器包括了三种生命周期,Singleton、Scoped和Transient。Singleton是全局实例,它存储到根容器上,从任何容器解析都会得到全局唯一的实例。Transient是瞬时实例,它不会存储到容器上,从任何容器解析都会重新实例化一个新的对象。Scoped是域内实......
  • SQL注入的各种姿势
    https://wooyun.js.org/drops/利用insert,update和delete注入获取数据.html基础流程#排序定列数1'orderby2##识别字段输出位置1'unionselect1,2##查数据库信息1'unionselectuser(),database()##版本、用户名'unionselectversion(),substring_index(U......