咨询区

  • LP13

我有三个 Service 类实现了同一个接口,参考代码如下:

public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }

我知道像其他的 DI 容器,比如 Unity 是在注册实现类的时候通过不同的key来区分,在 ASP.NET Core 中做 AddService 时并没有看到 keyname 参数的重载方法。

public void ConfigureServices(IServiceCollection services){            // How do I register services of the same interface?            }public MyController:Controller{public void DoSomething(string key){ // How do I resolve the service by key?}}

请问我该如何实现呢?

回答区

  • Miguel A. Arilla

我也遇到了这种场景,不过我是用 Func 做了一个折中方案。

首先:定义一个 委托

public delegate IService ServiceResolver(string key);

然后:在 Startup.cs 中做多个实现类注册。

services.AddTransient<ServiceA>();
services.AddTransient<ServiceB>();
services.AddTransient<ServiceC>();services.AddTransient<ServiceResolver>(serviceProvider => key =>
{switch (key){case "A":return serviceProvider.GetService<ServiceA>();case "B":return serviceProvider.GetService<ServiceB>();case "C":return serviceProvider.GetService<ServiceC>();default:throw new KeyNotFoundException(); // or maybe return null, up to you}
});

后期:如果想使用的话,通过 key 从 Func 中提取具体的实例,参考代码如下:

public class Consumer
{private readonly IService _aService;public Consumer(ServiceResolver serviceAccessor){_aService = serviceAccessor("A");}public void UseServiceA(){_aService.DoTheThing();}
}

为了做演示目的,我这里只用了 string 作为解析,你可以根据自己的场景具体实现。

点评区

Asp.Net Core 中是不支持这种多注册的,这就有点尴尬了,Miguel A. Arilla 大佬提供的方案不错,学习了。

Asp.NET Core 一个接口的多个实现如何通过 DI 注册?相关推荐

  1. Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册

    前言 假设我们有三个Service类实现了同一接口,示例代码如下: public interface IService { } public class ServiceA : IService { } ...

  2. 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?

    ASP.NET Core 的请求处理管道由一个Server和一组有序排列的中间件构成,前者仅仅完成基本的请求监听.接收和响应的工作,请求接收之后和响应之前的所有工作都交给注册的中间件来完成.ASP.N ...

  3. 使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

    0. 简要介绍 WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果. PS:Wrk 并不能针对测试的 ...

  4. asp.net core mvc接口,请求响应统一日志管理

    如何为api所有的请求和响应做一个统一的日志记录 1.创建日志类 public class RequestResponseLog {public string Url { get; set; }pub ...

  5. 【ASP.NET Core】ASP.NET Core 依赖注入

    一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control) ...

  6. ASP.NET Core 2 学习笔记(四)依赖注入

    原文:ASP.NET Core 2 学习笔记(四)依赖注入 ASP.NET Core使用了大量的依赖注入(Dependency Injection, DI),把控制反转(Inversion Of Co ...

  7. 全面理解 ASP.NET Core 依赖注入

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

  8. ASP.NET Core MVC/WebAPi如何构建路由?

    前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...

  9. core控制器属性注入的用处_了解ASP.NET Core 依赖注入,看这篇就够了

    DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例 ...

最新文章

  1. linux下Qt调用C++库文件(.so)程序实现
  2. 钱学森在30年前对虚拟现实和元宇宙的思考
  3. HDU——2064汉诺塔III
  4. 【模板】扩展中国剩余定理(EXCRT)
  5. python中readlines函数例子_Python的函数readlines(n)行为
  6. 数据库-优化-MYSQL数据库设计原则
  7. 教师计算机考试登记网,计算机等级考试及计算机资格考试
  8. nginx开启core dump文件
  9. libinject的编译
  10. 达摩院 2020 预测:模块化降低芯片设计门槛 | 问底中国 IT 技术演进
  11. 查oracle执行的sql,oracle查询正在执行的sql
  12. 190321每日一句
  13. 基于java springboot框架的电子发票管理系统
  14. VMware虚拟机中Ubuntu16.04系统下通过MVS运行海康威视工业相机
  15. 戴尔r330服务器怎么用u盘装系统,怎么用U盘装系统
  16. 01_测试基础知识---微信公众号测试点
  17. 阿里云查找或修改对应实例的远程连接密码
  18. 必须学会的几个网络测试命令
  19. VB如何自动保存_VB开发的身份证个人信息自动识别软件
  20. GitHub 代码托管平台提交代码时 emoji 表情的使用

热门文章

  1. 树状数组 + 位运算 LA 4013 A Sequence of Numbers
  2. 解决 同时安装 python3,python2环境时,用pip安装 python3 包
  3. 任务管理器在右下角的图标不显示
  4. aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理
  5. 你的知识死角不能否定你的技术能力
  6. PHP: 手把手编写自己的 MVC 框架实例教程
  7. IBM X System ServerGuide 8.41 服务器 系统安装 引导盘
  8. 解决VS2010 beta2 安装后html标签和script智能提示不起作用的问题
  9. 如何在PowerPoint中自动调整图片大小
  10. roku能不能安装软件_如何阻止假期更改Roku主题