欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.net?core使用Autofac實(shí)現(xiàn)泛型依賴注入

 更新時(shí)間:2022年04月29日 15:03:43   作者:騙你學(xué)計(jì)算機(jī)  
這篇文章主要介紹了ASP.net?core使用Autofac實(shí)現(xiàn)泛型依賴注入的方式學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是泛型依賴注入

創(chuàng)建兩個(gè)帶泛型的類,并配置兩者的依賴關(guān)系,對(duì)于繼承這兩個(gè)類的子類,如果泛型相同,則會(huì)繼承這種依賴關(guān)系:

如上圖:

定義了兩個(gè)泛型base類:BaseService和BaseRepository

對(duì)于UserService和UserRpository分別繼承兩個(gè)base類,泛型都是User,則他們倆繼承了父類的依賴關(guān)系。

.net core里實(shí)現(xiàn)泛型依賴注入

安裝Autofac

先看項(xiàng)目結(jié)構(gòu)

IMyRepository定義倉(cāng)儲(chǔ)接口

    public interface IMyRepository<T> where T: class
    {
        string GetTypeof();
    }

MyRepositoryBase倉(cāng)儲(chǔ)實(shí)現(xiàn)

    public class MyRepositoryBase<T> : IMyRepository<T> where T : class
    {
        public string GetTypeof()
        {
            return typeof(T).Name; //通過(guò)typeof可以知道泛型的名字
        }
    }

CustomAutofacModule 公共的依賴注入類

    public class CustomAutofacModule : Module
    {
        public CustomAutofacModule(ContainerBuilder builder) {
        }
        /// <summary>
        /// AutoFac注冊(cè)類
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterGeneric(typeof(MyRepositoryBase<>)).As(typeof(IMyRepository<>)).InstancePerDependency();//注冊(cè)倉(cāng)儲(chǔ)泛型
//builder.RegisterGeneric(typeof(MyRepositoryBase<,>)).As(typeof(IMyRepository<,>)).InstancePerDependency();//注冊(cè)倉(cāng)儲(chǔ)泛型 2個(gè)以上的泛型參數(shù)
         //  builder.RegisterType<myAssembly>().As<ImyAssembly>();   //普通依賴注入
        }
    }

在Program聲明實(shí)現(xiàn)依賴注入

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                //改用Autofac來(lái)實(shí)現(xiàn)依賴注入
                .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

修改Startup

運(yùn)行時(shí)候觸發(fā)CustomAutofacModule

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        //autofac 新增
        public ILifetimeScope AutofacContainer { get; private set; }
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
        }
        public void ConfigureContainer(ContainerBuilder builder)
        {
            // 直接用Autofac注冊(cè)我們自定義的 
            builder.RegisterModule(new CustomAutofacModule(builder));
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //autofac 新增 
            this.AutofacContainer = app.ApplicationServices.GetAutofacRoot();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }

在Home控制器中使用

    [ApiController]
    [Route("[controller]")]
    public class HomeController : ControllerBase
    {
        //public IMyRepository<User> _UserServer { get; set; }
        private readonly IMyRepository<User> _UserServer;
        private readonly IMyRepository<Role> _RoleServer;
        public HomeController(IMyRepository<User> UserServer, IMyRepository<Role> RoleServer)
        {
            _UserServer = UserServer;
            _RoleServer = RoleServer;
        }
        [Route("Get")]
        public string Get() {
            return _UserServer.GetTypeof();//"user"; //
        }
        [Route("GetRole")]
        public string GetRole()
        {
            return _RoleServer.GetTypeof();//"role"; //
        }
    }

可以看到 不同的地方實(shí)現(xiàn)不同的對(duì)象

番外:

我是因?yàn)榭吹紸BP框架的IRepository的實(shí)現(xiàn)才研究泛型依賴注入的用法的。

ABP框架吧Autofac已經(jīng) 封裝為IocManager 了

所以ABP框架不需要 引入Autofac框架。只需要在對(duì)應(yīng)的XXXCoreModule 中的Initialize()方法聲明依賴注入便可

IocManager.Register(typeof(IMyRepository<>), typeof(MyRepositoryBase<>), DependencyLifeStyle.Transient);

如果是2個(gè)以上的泛型寫法是

 IocManager.Register(typeof(IAmbientScopeProvider<,>), typeof(DataContextAmbientScopeProvider<,>), DependencyLifeStyle.Transient);

DependencyLifeStyle.Transient 的作用

Transient :瞬態(tài),要么作用域是整個(gè)進(jìn)程,要么作用域是一個(gè)請(qǐng)求,而這里的 Transient 就沒(méi)有作用域概念了,注入一次 實(shí)例化一次 最明顯的區(qū)別,屬性注入是不可用的,只能構(gòu)造函數(shù)注入

Singleton:可以在你的進(jìn)程中保持著一個(gè)實(shí)例,也就是說(shuō)僅有一次實(shí)例化 最明顯的區(qū)別,屬性注入是可用的

番外2:

看到了很多教程是不用聲明CustomAutofacModule類的直接在Startup聲明依賴注入就可以的。但是那是core 2.0的寫法。core 3.0 下面的寫法是會(huì)報(bào)錯(cuò)的

public static IContainer AutofacContainer;
// This method gets called by the runtime. Use this method to add services to the container.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    //注冊(cè)服務(wù)進(jìn) IServiceCollection
    services.AddMvc();
    ContainerBuilder builder = new ContainerBuilder();
    //將services中的服務(wù)填充到Autofac中.
    builder.Populate(services);
    //新模塊組件注冊(cè)
    builder.RegisterModule<DefaultModuleRegister>();
    //創(chuàng)建容器.
    AutofacContainer = builder.Build();
    //使用容器創(chuàng)建 AutofacServiceProvider 
    return new AutofacServiceProvider(AutofacContainer);
}

以上就是ASP.net core使用Autofac實(shí)現(xiàn)泛型依賴注入的詳細(xì)內(nèi)容,更多關(guān)于ASP.net core Autofac泛型依賴注入的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論