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. ...
随机推荐
- luoguP1164 小A点菜(背包问题)
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...
- 【贪心】bzoj1572: [Usaco2009 Open]工作安排Job
先是没怎么理解这个贪心……然后贪心又被细节弄挂…… Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. ...
- 【OS_Linux】Linux下软件的安装与卸载
1.Linux中软件安装包的分类 1) 一类是可执行的软件包,无需编译直接安装.在Windows中所有的软件包都是这种类型.安装完这个程序后,你就可以使用,但你看不到源程序.而且下载时要注意这个软件是 ...
- Python Third Day-文件处理
文件处理 打开文件,得到文件句柄并赋值给一个变量f=open('a.txt','r',encoding='utf-8')#默认打开的方式为r指的是文本文件,全名为‘rt’#w文件方式指的是如果有a.t ...
- PHP中文件锁与进程锁的使用区别
php中文网的一篇文章,收为己用了.源地址: http://www.php.cn/php-weizijiaocheng-376853.html 本篇文章主要介绍了PHP 文件锁与进程锁的使用示例,小编 ...
- (转)iOS 最佳实践
本文转自http://www.jianshu.com/p/b0bf2368fb95 感谢作者和译者 iOS最佳实践 iOS最佳实践 译者注 本文翻译自 futurice 公司的 iOS Good Pr ...
- nrf52810学习笔记——三
在开发nRF52系列的蓝牙方案的时候,会用到IDE.SDK.softdevice.nrfgoStudio等开发软件,这里做一个小小的总结. 首先,下载SDK,里面有适合keil4号iar7(iar8也 ...
- JavaScript 逗号操作符
让我们从一个有趣的微博开始吧. 末尾的c是优先级最低的逗号操作符.逗号操作符是操作符优先级的最后一行,并且很少有文章记录,它隐藏着它的锋芒.它可能不是JavaScript强势操作符,但是我喜欢它.它简 ...
- vue 判断属性是否为object
//递归对象 var recursiveObject = Vue.extend({ name: 'recursive-object', template:[ '<ul>', '<li ...
- Leetcode 397.整数替换
整数替换 给定一个正整数 n,你可以做如下操作: 1. 如果 n 是偶数,则用 n / 2替换 n.2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n.n 变为 1 所需的最小替换次数是 ...