在.NET Core中处理一个接口多个不同实现的依赖注入问题
<h2 id="前言">前言 近段时间在准备公司的技术分享,所以这段时间将大部分时间放在准备分享内容上去了。博客也就停了一下下。 在.NET Core中处理依赖注入问题时,往往是定义好了一个操作规范的接口,会有N多个基于不同技术的实现,根据实际情况在项目中去使用某一个实现。 但是偶尔会出现这样的情况,在某一个地方,需要同时使用到两种或两种以上的实现,这个时候我们要怎么处理呢? 借助Autofac等第三方组件时,是可以很容易的实现,但是在写一些基础类库时会避免直接引用太多依赖组件。 所以这里是只用微软自带的DI(Microsoft.Extensions.DependencyInjection)去处理。 现在有一个接口和两个实现类。 public interface IDemoService { string Get(); } 常规的方法,我们先在Startup中的ConfigureServices方法中添加我们的service。 public void ConfigureServices(IServiceCollection services) { services.AddSingleton 然后在控制器中使用 private IDemoService _serviceA; 我们的预期结果是: 可以看到这里输出的都是 其实,从代码都可以看出来,它只能拿到其中一个Service的实现类! 那么我们要息怎样处理才能达到我们想要的效果呢? 其实思路比较简单,上面导致不能拿到对应实现类,本质上来讲应该说是它区分不了那个才是想要的!我们想个办法让它能区分就好了。 给我们的Service起个别名! 先是Startup中的ConfigureServices方法。 public void ConfigureServices(IServiceCollection services) { services.AddSingleton 这里并没有直接向上面那样一次性指定接口和对应的实现类,而是用了AddSingleton的另一个重载方法。
先来说说这个
核心在于,factory参数是IServiceProvider类型的!所以我们可以根据这个factory去找到我们前面注册的实现类。这样解释一下,是不是就清晰了呢? 然后再来看看在控制器上面怎么用。 private IDemoService _serviceA; 最后看看结果是不是和我们的预期一样。 结果与预期一致。 一对一,或许是最好的方法,也是最为理想的,这样能避开很多不必要的问题。但是现实中总会出现特殊情况,面对这些特殊情况,我们也是需要能够重容的面对。 如果您有更好的处理方法,也可以留言讨论。 文中的示例代码 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 实体框架 – 使用伪造的DbContext和Autofixture以及Moq进行
- c#初学-多线程中lock用法的经典实例
- asp.net – 如何在javascript中检测/跟踪回发?
- asp.net – 如何禁用谷歌chrome的建议列表使用twitter boot
- ASP.Net页面刷新后自动滚动到原来位置
- asp.net – 为什么压缩ScriptResource.axd,即使禁用了IIS压
- asp.net-core – 从ASP.NET Core MVC Web应用程序(RC2)引用
- asp.net – 实体框架“等待操作超时”就简单的DeleteAll
- 如何在ASP.NET中实现浮动许可证?
- ASP.NET Core Web API
- asp.net-mvc-3 – ASP.NET MVC3维护导航历史
- rest – ASP.NET Web API身份验证选项
- asp.net-mvc-4 – 无法获取MVC 4 FileExtensions
- ASP.NET TreeView控件的使用
- asp.net-mvc – ASP.NET MVC路由 – 所有看起来都
- asp.net – WCF数据服务还是只是WCF服务?
- 你能混用ASP和ASP.NET吗?
- asp.net – CookieAuthenticationOptions.Authen
- asp.net – 如何在经典的asp中使用.net共享会话?
- asp.net-mvc – 如何在Entity Framework中重用投