.Net Core DI依赖注入:一个接口注入多个实现类(转载)
方式一、默认就可以注入多个实现类
例如接口IShow,注入ShowA和ShowB两个实现类:
services.AddTransient<IShow, ShowA>();
services.AddTransient<IShow, ShowB>();
获取的时候默认是获取到最后一个,如下所示:
可以使用"IEnumerable<IShow> showList" 的方式来获取所有注入的实现类,如下所示:
还可以用IServiceProvider接口的扩展方法"IEnumerable<T> GetServices<T>(this IServiceProvider provider)",来获取所有注入的实现类:
IServiceCollection services = new ServiceCollection(); services.AddTransient<IShow, ShowA>(); services.AddTransient<IShow, ShowB>(); using (ServiceProvider serviceProvider = services.BuildServiceProvider()) { IEnumerable<IShow> shows = serviceProvider.GetServices<IShow>(); foreach (var show in shows) { show.Show(); } }
结果如下:
方式二、使用注入方法”AddTransient<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory)“ 来实现
还是接口IShow,注入ShowA和ShowB两个实现类:
services.AddTransient<ShowA>(); services.AddTransient<ShowB>(); services.AddTransient(serviceProvider => { Func<Type, IShow> accesor = key => { if (key == typeof(ShowA)) return serviceProvider.GetService<ShowA>(); else if (key == typeof(ShowB)) return serviceProvider.GetService<ShowB>(); else throw new ArgumentException($"不支持的DI Key: {key}"); }; return accesor; });
获取方式如下所示:
分类:
.Net Core
, ASP.NET Core
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2015-09-10 SSAS维度上有多个表的注意事项
2009-09-10 html伪选择子的顺序问题
2009-09-10 IE8/FireFox下容器水平垂直布局问题: