網站首頁 編程語言 正文
什么是泛型依賴注入
創建兩個帶泛型的類,并配置兩者的依賴關系,對于繼承這兩個類的子類,如果泛型相同,則會繼承這種依賴關系:
如上圖:
定義了兩個泛型base類:BaseService和BaseRepository
對于UserService和UserRpository分別繼承兩個base類,泛型都是User,則他們倆繼承了父類的依賴關系。
.net core里實現泛型依賴注入
安裝Autofac
先看項目結構
IMyRepository定義倉儲接口
public interface IMyRepository<T> where T: class { string GetTypeof(); }
MyRepositoryBase倉儲實現
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個以上的泛型參數 // builder.RegisterType<myAssembly>().As<ImyAssembly>(); //普通依賴注入 } }
在Program聲明實現依賴注入
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) //改用Autofac來實現依賴注入 .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
修改Startup
運行時候觸發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"; // } }
可以看到 不同的地方實現不同的對象
番外:
我是因為看到ABP框架的IRepository的實現才研究泛型依賴注入的用法的。
ABP框架吧Autofac已經 封裝為IocManager 了
所以ABP框架不需要 引入Autofac框架。只需要在對應的XXXCoreModule 中的Initialize()方法聲明依賴注入便可
IocManager.Register(typeof(IMyRepository<>), typeof(MyRepositoryBase<>), DependencyLifeStyle.Transient);
如果是2個以上的泛型寫法是
IocManager.Register(typeof(IAmbientScopeProvider<,>), typeof(DataContextAmbientScopeProvider<,>), DependencyLifeStyle.Transient);
DependencyLifeStyle.Transient 的作用
Transient
:瞬態,要么作用域是整個進程,要么作用域是一個請求,而這里的 Transient 就沒有作用域概念了,注入一次 實例化一次 最明顯的區別,屬性注入是不可用的,只能構造函數注入
Singleton
:可以在你的進程中保持著一個實例,也就是說僅有一次實例化 最明顯的區別,屬性注入是可用的
番外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>(); //創建容器. AutofacContainer = builder.Build(); //使用容器創建 AutofacServiceProvider return new AutofacServiceProvider(AutofacContainer); }
原文鏈接:https://blog.csdn.net/wangwengrui40/article/details/115024997
相關推薦
- 2022-02-17 出現Presentation Error的解決方法
- 2022-09-15 python安裝whl文件的實戰步驟_python
- 2022-09-21 Python機器學習庫scikit-learn入門開發示例_python
- 2022-06-12 python將Dataframe格式的數據寫入opengauss數據庫并查詢_python
- 2022-12-07 C語言如何求整數的位數及各位數字之和_C 語言
- 2023-03-05 Go語言學習之golang-jwt/jwt的教程分享_Golang
- 2023-06-19 深入了解Golang中Slice切片的使用_Golang
- 2023-07-26 webpack中plugin的工作原理
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支