ASP.net?core使用Autofac實(shí)現(xià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)文章
WPF集合控件實(shí)現(xiàn)分隔符(ItemsControl Separator)
這篇文章主要為大家詳細(xì)介紹了WPF集合控件實(shí)現(xiàn)分隔符ItemsControl Separator,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04解決uploadify使用時(shí)session發(fā)生丟失問(wèn)題的方法
這篇文章主要為大家詳細(xì)介紹了uploadify使用時(shí)發(fā)現(xiàn)session發(fā)生丟失問(wèn)題的解決方法,遇到過(guò)類似問(wèn)題的朋友可以參考本文進(jìn)行解決2016-05-05簡(jiǎn)單談?wù)?NET Core跨平臺(tái)開發(fā)
本文給大家詳細(xì)介紹了如何使用.NET Core進(jìn)行跨平臺(tái)開發(fā),包含簡(jiǎn)單的環(huán)境架設(shè)以及配置,以及使用vs進(jìn)行編譯運(yùn)行項(xiàng)目和注意事項(xiàng),有需要的小伙伴可以參考下2016-07-07ASP.NET簡(jiǎn)單好用功能齊全圖片上傳工具類(水印、縮略圖、裁剪等)
這篇文章主要介紹了ASP.NET簡(jiǎn)單好用功能齊全圖片上傳工具類(水印、縮略圖、裁剪等),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06一個(gè)簡(jiǎn)單的ASP.NET Forms 身份認(rèn)證的實(shí)例方法
當(dāng)訪問(wèn)默認(rèn)首頁(yè)default.aspx時(shí),會(huì)自動(dòng)跳轉(zhuǎn)到login.aspx頁(yè)面上請(qǐng)求登錄,隨便輸入用戶名和密碼,點(diǎn)擊“登錄”按鈕,會(huì)回到首頁(yè),并顯示當(dāng)前登錄的用戶名。2013-07-07