ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客
原文:ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客
版权声明:本文为starfd原创文章,转载请标明出处。 https://blog.csdn.net/starfd/article/details/81282651
在我们开发过程中,对于服务来说,一般我们定义interface
实现均只存在一个具体实现(有人戏称这种情况为十代单传模式),这时候Core默认的注入方式已经支持我们的需求,但对于某些抽象定义实现来讲,我们可能会有多种具体实现,在项目中,我们可能会按照具体需求选用不同的实现。
首先先具体下我们的业务场景例子,假设我们有以下interface
及它的两个具体实现
public interface ILogicService
{
int GetNo();
}
public class LogicSericeImpt1 : ILogicService
{
public int GetNo()
{
return 1;
}
}
public class LogicSericeImpt2 : ILogicService
{
public int GetNo()
{
return 2;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
例子非常简单,就是不同的实现返回不同的编号,下面就来讲在注入的情况下怎么获取不同的实现。
直接注入IServiceProvider
的方式
因为在Core里面,IServiceProvider
是允许直接注入到具体应用里的,所以就有了直接通过IServiceProvider
来获取具体实现的方式。
1. 通过GetService
方式
首先注入具体实现
services.AddTransient<LogicSericeImpt1>();
services.AddTransient<LogicSericeImpt2>();
- 1
- 2
然后在构造函数中通过如下方式获取具体实现
public TodoController(IServiceProvider serviceProvider)
{
var s1FromProvider = serviceProvider.GetService<LogicSericeImpt1>();
var s2FromProvider = serviceProvider.GetService<LogicSericeImpt2>();
}
- 1
- 2
- 3
- 4
- 5
2. 通过GetServices
方式
首先注入interface
及具体实现
services.AddTransient<ILogicService, LogicSericeImpt1>();
services.AddTransient<ILogicService, LogicSericeImpt2>();
- 1
- 2
然后在构造函数中通过如下方式获取具体实现
public TodoController(IServiceProvider serviceProvider)
{
var logicAllRegs = serviceProvider.GetServices<ILogicService>().ToList();
var s1FromAllRegs = logicAllRegs[0];
var s2FromAllRegs = logicAllRegs[1];
}
- 1
- 2
- 3
- 4
- 5
- 6
直接注入集合的方式
这种方式其实就是省去了注入IServiceProvider
的过程,直接将GetServices
获取的结果进行注入。首先注入interface
及具体实现
services.AddTransient<ILogicService, LogicSericeImpt1>();
services.AddTransient<ILogicService, LogicSericeImpt2>();
- 1
- 2
然后在构造函数中通过如下方式获取具体实现
public TodoController(IEnumerable<ILogicService> services)
{
var s1FromServices = services.First();
var s2FromServices = services.Skip(1).First();
}
- 1
- 2
- 3
- 4
- 5
直接注入Func
工厂的方式
在这种方式下,我们并不是直接注入具体实现,而是注入了Func
这么一个工厂实现。首先我们还是需要注入具体实现
services.AddTransient<LogicSericeImpt1>();
services.AddTransient<LogicSericeImpt2>();
- 1
- 2
然后我们继续注入Func这个工厂,这里我们按int
来返回不同的实现,当然你也可以采用其他方式比如string
services.AddSingleton(provider =>
{
Func<int, ILogicService> func = n =>
{
switch (n)
{
case 1:
return provider.GetService<LogicSericeImpt1>();
case 2:
return provider.GetService<LogicSericeImpt2>();
default:
throw new NotSupportedException();
}
};
return func;
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
然后在构造函数中通过如下方式获取具体实现
public TodoController(Func<int, ILogicService> funcFactory)
{
var s1FromFunc = funcFactory(1);
var s2FromFunc = funcFactory(2);
}
- 1
- 2
- 3
- 4
- 5
ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客的更多相关文章
- ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客
原文:ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客 上一篇文章中我们已经成功的记录了Request部分的信息,现在我们来看下如何记录Res ...
- ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客
原文:ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.csd ...
- ASP.NET Core默认容器实现Controller的属性注入
仅针对Controller的属性注入: 使用默认容器,不依赖第三方库: 故事背景 闲来无事给项目做优化,发现大多数Controller里面都会用到Logger和AutoMapper,每个Contr ...
- 聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer
跨平台是ASP.NET Core一个显著的特性,而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server.KestrelServer利用一个名为KestrelEngine的网络 ...
- ASP.NET Core - 在ActionFilter中使用依赖注入
上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...
- Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
QuartzHostedService 是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...
- [ASP.NET Core 3框架揭秘] Options[1]: 配置选项的正确使用方式[上篇]
依赖注入不仅是支撑整个ASP.NET Core框架的基石,也是开发ASP.NET Core应用采用的基本编程模式,所以依赖注入十分重要.依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式 ...
- [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]
四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...
- 微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战
微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战 友情提示: 操作系统: MacOS 10.13.5 dotnet core: version 2.1. ...
随机推荐
- CF-1111 (2019/2/7 补)
CF-1111 题目链接 A. Superhero Transformation tags : strings #include <bits/stdc++.h> using namespa ...
- PHP调用新浪API 生成短链接
我们经常收到类似于这样的短信(如下图),发现其中的链接并不是常规的网址链接,而是个短小精悍的短链接,产品中经常需要这样的需求,如果在给用户下发的短信中是一个很长的连接,用户体验肯定很差,因此我们需要实 ...
- 蓝牙学习 (6) - Play with TI sensorTag (1)
硬件 cc2650 SensorTag Connect with App 在手机上安装Ti提供的sensorTag App即可和sensorTag 建立连接. 如下手机截图,
- 【02】markdown在线编辑器
[01]在线编辑器 https://www.zybuluo.com/mdeditor 在线 Markdown 编辑阅读器 pen - 是一个Markdown编辑器工具.demo 你可以试试这个在线的m ...
- 【LeetCode】Add Two Numbers(两数相加)
这道题是LeetCode里的第2道题. 题目要求: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将 ...
- [jenkins学习篇] 安装jenkins
1 下载war包,https://jenkins.io/download/ 2 安装jar包,java -jar jenkins.war 3 打开网址:http://localhost:8080 4 ...
- ASP.NET(二):Application、Session和Server对象
导读:在上篇博客中,总结了:Reques对象和Response对象的区别,以及IsPostBack属性的用法.其中说明Asp.net有6大对象,那么,这次就介绍剩下的3个对象,分别是:Applicat ...
- JSON.parse与eval区别
两种方式都可以解析json字符串,不过有时候JSON.parse解析会失败,失败原因有多种,下面会指出一种. JSON.parse()解析json格式的数据,会对要解析的字符串进行格式检查,如果格式不 ...
- hdu 4251 The Famous ICPC Team Again划分树入门题
The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- LinkedList的构造函数有哪些
LinkedList构造函数有(两种): public LinkedList() public LinkedList(Collection<? extends E> c) /** * Co ...