溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2022-04-29 17:18:39 來源:億速云 閱讀:553 作者:iii 欄目:開發(fā)技術

本文小編為大家詳細介紹“ASP.net core怎么使用Autofac實現(xiàn)泛型依賴注入”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“ASP.net core怎么使用Autofac實現(xiàn)泛型依賴注入”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

    什么是泛型依賴注入

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

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

    如上圖: 

    定義了兩個泛型base類:BaseService和BaseRepository 

    對于UserService和UserRpository分別繼承兩個base類,泛型都是User,則他們倆繼承了父類的依賴關系。

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

    安裝Autofac

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

    先看項目結構

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

    IMyRepository定義倉儲接口

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

    MyRepositoryBase倉儲實現(xiàn)

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

    CustomAutofacModule 公共的依賴注入類

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

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

    ASP.net?core怎么使用Autofac實現(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來實現(xiàn)依賴注入
                    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }

    修改Startup

    運行時候觸發(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注冊我們自定義的 
                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"; //
            }
     
        }

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

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

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

      番外:

    我是因為看到ABP框架的IRepository的實現(xiàn)才研究泛型依賴注入的用法的。

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

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

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

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

    如果是2個以上的泛型寫法是

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

     DependencyLifeStyle.Transient 的作用

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

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

      番外2:

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

    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)
    {
        //注冊服務進 IServiceCollection
        services.AddMvc();
        ContainerBuilder builder = new ContainerBuilder();
        //將services中的服務填充到Autofac中.
        builder.Populate(services);
        //新模塊組件注冊
        builder.RegisterModule<DefaultModuleRegister>();
        //創(chuàng)建容器.
        AutofacContainer = builder.Build();
        //使用容器創(chuàng)建 AutofacServiceProvider 
        return new AutofacServiceProvider(AutofacContainer);
    }

    讀到這里,這篇“ASP.net core怎么使用Autofac實現(xiàn)泛型依賴注入”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內(nèi)容的文章,歡迎關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

    AI