ASP.net?core使用Autofac實現(xiàn)泛型依賴注入
什么是泛型依賴注入
創(chuàng)建兩個帶泛型的類,并配置兩者的依賴關(guān)系,對于繼承這兩個類的子類,如果泛型相同,則會繼承這種依賴關(guān)系:
如上圖:
定義了兩個泛型base類:BaseService和BaseRepository
對于UserService和UserRpository分別繼承兩個base類,泛型都是User,則他們倆繼承了父類的依賴關(guān)系。
.net core里實現(xiàn)泛型依賴注入
安裝Autofac
先看項目結(jié)構(gòu)
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)依賴注入
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
運(yùn)行時候觸發(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)不同的對象
番外:
我是因為看到ABP框架的IRepository的實現(xiàn)才研究泛型依賴注入的用法的。
ABP框架吧Autofac已經(jīng) 封裝為IocManager 了
所以ABP框架不需要 引入Autofac框架。只需要在對應(yīng)的XXXCoreModule 中的Initialize()方法聲明依賴注入便可
IocManager.Register(typeof(IMyRepository<>), typeof(MyRepositoryBase<>), DependencyLifeStyle.Transient);
如果是2個以上的泛型寫法是
IocManager.Register(typeof(IAmbientScopeProvider<,>), typeof(DataContextAmbientScopeProvider<,>), DependencyLifeStyle.Transient);
DependencyLifeStyle.Transient 的作用
Transient
:瞬態(tài),要么作用域是整個進(jìn)程,要么作用域是一個請求,而這里的 Transient 就沒有作用域概念了,注入一次 實例化一次 最明顯的區(qū)別,屬性注入是不可用的,只能構(gòu)造函數(shù)注入
Singleton
:可以在你的進(jìn)程中保持著一個實例,也就是說僅有一次實例化 最明顯的區(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) { //注冊服務(wù)進(jìn) IServiceCollection services.AddMvc(); ContainerBuilder builder = new ContainerBuilder(); //將services中的服務(wù)填充到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)泛型依賴注入的詳細(xì)內(nèi)容,更多關(guān)于ASP.net core Autofac泛型依賴注入的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
WPF集合控件實現(xiàn)分隔符(ItemsControl Separator)
這篇文章主要為大家詳細(xì)介紹了WPF集合控件實現(xiàn)分隔符ItemsControl Separator,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04解決uploadify使用時session發(fā)生丟失問題的方法
這篇文章主要為大家詳細(xì)介紹了uploadify使用時發(fā)現(xiàn)session發(fā)生丟失問題的解決方法,遇到過類似問題的朋友可以參考本文進(jìn)行解決2016-05-05ASP.NET簡單好用功能齊全圖片上傳工具類(水印、縮略圖、裁剪等)
這篇文章主要介紹了ASP.NET簡單好用功能齊全圖片上傳工具類(水印、縮略圖、裁剪等),本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-06-06一個簡單的ASP.NET Forms 身份認(rèn)證的實例方法
當(dāng)訪問默認(rèn)首頁default.aspx時,會自動跳轉(zhuǎn)到login.aspx頁面上請求登錄,隨便輸入用戶名和密碼,點擊“登錄”按鈕,會回到首頁,并顯示當(dāng)前登錄的用戶名。2013-07-07