原文: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博客的更多相关文章

  1. ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core 如何记录每次响应的Response信息 - sky 胡萝卜星星 - CSDN博客 上一篇文章中我们已经成功的记录了Request部分的信息,现在我们来看下如何记录Res ...

  2. ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core 如何记录每次请求的Request信息 - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.csd ...

  3. ASP.NET Core默认容器实现Controller的属性注入

    仅针对Controller的属性注入: 使用默认容器,不依赖第三方库: 故事背景   闲来无事给项目做优化,发现大多数Controller里面都会用到Logger和AutoMapper,每个Contr ...

  4. 聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer

    跨平台是ASP.NET Core一个显著的特性,而KestrelServer是目前微软推出了唯一一个能够真正跨平台的Server.KestrelServer利用一个名为KestrelEngine的网络 ...

  5. ASP.NET Core - 在ActionFilter中使用依赖注入

    上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...

  6. Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)

    QuartzHostedService  是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...

  7. [ASP.NET Core 3框架揭秘] Options[1]: 配置选项的正确使用方式[上篇]

    依赖注入不仅是支撑整个ASP.NET Core框架的基石,也是开发ASP.NET Core应用采用的基本编程模式,所以依赖注入十分重要.依赖注入使我们可以将依赖的功能定义成服务,最终以一种松耦合的形式 ...

  8. [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]

    四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...

  9. 微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战

    微软官方实例 RazorPagesMovie 在 asp.net core 2.1 版本下的实战 友情提示: 操作系统: MacOS 10.13.5 dotnet core: version 2.1. ...

随机推荐

  1. C++后台知识点总结(一)

    C++基础部分: 1.数组和指针的区别 (1)数组本身体现出来的就是一个 指针常量的 “特性”,即不能对数组的首地址进行修改,内存上的地址就已经是确定了的.而指针本身是一个变量,他指向了一个地址,这个 ...

  2. 【状态压缩 meet in middle】poj3139Balancing the Scale

    数组溢出真是可怕的事情 Description You are given a strange scale (see the figure below), and you are wondering ...

  3. [LUOGU] P1387 最大正方形

    题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...

  4. Re:从零开始的Linux之路(文件权限)

    基于 Red Hat Enterprise Linux 7.5 或者 CentOS 7.4 基本概念 Linux最核心的一个概念就是:Linux里面任何东西都可以被视为一个文件,包括系统本身(说到底L ...

  5. 日志logging

    日志: 日志分为5个级别:debug(10),info(20),warning(30),error(40),critical(50) 日志四个组成部分:logger,handler,filter,fo ...

  6. (转) iOS程序国际化

    IOS程序国际化  本文转自http://www.cnblogs.com/zhidao-chen/archive/2012/07/08/2581977.html 1.1 新建一个Single View ...

  7. 关于set和multiset的一些用法

    set的一些用法 set的特性 set的特性是,所有元素都会根据元素的键值自动排序,set不允许两个元素有相同的键值. set的一些常用操作函数 insert() insert(key_value); ...

  8. POJ:3461-Oulipo(KMP模板题)

    原题传送:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Description The F ...

  9. zoj2112 主席树动态第k大 (主席树&&树状数组)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  10. BZOJ 3240 [Noi2013]矩阵游戏 ——费马小定理 快速幂

    发现是一个快速幂,然而过不去. 怎么办呢? 1.十进制快速幂,可以用来练习卡时. 2.费马小定理,如果需要乘方的地方,可以先%(p-1)再计算,其他地方需要%p,所以需要保存两个数. 然后就是分类讨论 ...