Asp.NET Core 一个接口的多个实现如何通过 DI 注册?
咨询区
LP13
我有三个 Service
类实现了同一个接口,参考代码如下:
public interface IService { }
public class ServiceA : IService { }
public class ServiceB : IService { }
public class ServiceC : IService { }
我知道像其他的 DI 容器,比如 Unity 是在注册实现类的时候通过不同的key来区分,在 ASP.NET Core
中做 AddService 时并没有看到 key
或 name
参数的重载方法。
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 注册?相关推荐
- Asp.NET Core一个接口的多个实现如何基于当前HTTP请求注册
前言 假设我们有三个Service类实现了同一接口,示例代码如下: public interface IService { } public class ServiceA : IService { } ...
- 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?
ASP.NET Core 的请求处理管道由一个Server和一组有序排列的中间件构成,前者仅仅完成基本的请求监听.接收和响应的工作,请求接收之后和响应之前的所有工作都交给注册的中间件来完成.ASP.N ...
- 使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试
0. 简要介绍 WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果. PS:Wrk 并不能针对测试的 ...
- asp.net core mvc接口,请求响应统一日志管理
如何为api所有的请求和响应做一个统一的日志记录 1.创建日志类 public class RequestResponseLog {public string Url { get; set; }pub ...
- 【ASP.NET Core】ASP.NET Core 依赖注入
一.什么是依赖注入(Denpendency Injection) 这也是个老身常谈的问题,到底依赖注入是什么? 为什么要用它? 初学者特别容易对控制反转IOC(Iversion of Control) ...
- ASP.NET Core 2 学习笔记(四)依赖注入
原文:ASP.NET Core 2 学习笔记(四)依赖注入 ASP.NET Core使用了大量的依赖注入(Dependency Injection, DI),把控制反转(Inversion Of Co ...
- 全面理解 ASP.NET Core 依赖注入
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
- ASP.NET Core MVC/WebAPi如何构建路由?
前言 本节我们来讲讲ASP.NET Core中的路由,在讲路由之前我们首先回顾下之前所讲在ASP.NET Core中的模型绑定这其中有一个问题是我在项目当中遇见的,我们下面首先来看看这个问题. 回顾A ...
- core控制器属性注入的用处_了解ASP.NET Core 依赖注入,看这篇就够了
DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET Core的DI实现以及对实例 ...
最新文章
- linux下Qt调用C++库文件(.so)程序实现
- 钱学森在30年前对虚拟现实和元宇宙的思考
- HDU——2064汉诺塔III
- 【模板】扩展中国剩余定理(EXCRT)
- python中readlines函数例子_Python的函数readlines(n)行为
- 数据库-优化-MYSQL数据库设计原则
- 教师计算机考试登记网,计算机等级考试及计算机资格考试
- nginx开启core dump文件
- libinject的编译
- 达摩院 2020 预测:模块化降低芯片设计门槛 | 问底中国 IT 技术演进
- 查oracle执行的sql,oracle查询正在执行的sql
- 190321每日一句
- 基于java springboot框架的电子发票管理系统
- VMware虚拟机中Ubuntu16.04系统下通过MVS运行海康威视工业相机
- 戴尔r330服务器怎么用u盘装系统,怎么用U盘装系统
- 01_测试基础知识---微信公众号测试点
- 阿里云查找或修改对应实例的远程连接密码
- 必须学会的几个网络测试命令
- VB如何自动保存_VB开发的身份证个人信息自动识别软件
- GitHub 代码托管平台提交代码时 emoji 表情的使用
热门文章
- 树状数组 + 位运算 LA 4013 A Sequence of Numbers
- 解决 同时安装 python3,python2环境时,用pip安装 python3 包
- 任务管理器在右下角的图标不显示
- aop实现原理_从宏观的实现原理和设计本质入手,带你理解 AOP 框架的原理
- 你的知识死角不能否定你的技术能力
- PHP: 手把手编写自己的 MVC 框架实例教程
- IBM X System ServerGuide 8.41 服务器 系统安装 引导盘
- 解决VS2010 beta2 安装后html标签和script智能提示不起作用的问题
- 如何在PowerPoint中自动调整图片大小
- roku能不能安装软件_如何阻止假期更改Roku主题