如何在 ASP.NET Core 中为同一接口配置不同的实现

前言

通常,我们使用依赖注入时,一个接口仅对应一种实现,使用时可以直接得到实现类的实例,类似这样:

services.AddScoped<IServiceA,ServiceA>();public WeatherForecastController(IServiceA service) { }

但是,有时可能需要在同一ASP.NET Core 应用程序中使用同一接口的不同实现。

下面是不同需求下对应的解决方案。

为不同的类型使用不同实现

例如仓储接口IRepository<>,默认使用EF core访问关系型数据库,而对于特定实体(例如订单Order)使用MONGODB存储。

可以首先注册默认实现,再针对特定实体注册指定实现:

services.AddScoped(typeof(IRepository<>), typeof(EFCoreRepository<>));
services.AddScoped(typeof(IRepository<Order>), typeof(MongoRepository<Order>));

106df9f770b719f8de1978d6a1d45dd5.png

在不同的Controller中使用不同实现

例如订单仓储接口IRepository,默认使用MONGODB存储,而在报表服务ReportController中访问ES。

可以针对构造函数注册指定参数:

services.AddScoped<ESRepository<Order>>();
services.AddScoped(x => new ReportController(x.GetRequiredService<ESRepository<Order>>()));

302dd6cd7ca6819a93927e928253ecd3.png

注意:以上方式需要使用命令将Controller添加为服务才能使用:

services.AddControllers().AddControllersAsServices();

结论

关于如何注入同一接口的不同实现,你有什么不同需求或者实现方案,欢迎在公众号首页留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery学习笔记2

一、获取并设置CSS类&#xff1a; 1、addClass( ) 方法 &#xff1a;可以选取多个元素&#xff0c;也可以在该方法中规定多个类。 1 $("#div1").addClass("important blue"); 2 $("h1,h2,p").addClass("blue"); 2、removeClass( )方法…

分析windows宿主机Ping不通linux虚拟机的其中一种情况

ping不通的情况是由于设置网络选项的时候&#xff0c;可以看到界面名称的选择如下(当前选择的是无线网卡驱动): ping得通的情况是由于设置网络选项的时候&#xff0c;可以看到界面名称的选择如下(当前选择的是有线网卡驱动): 分析原因是由于电脑有两个网卡驱动&#xff0c;一个…

C和指针之函数之实现阶乘和斐波那契数(递归和非递归)

1、问题 实现阶乘和斐波那契数(递归和非递归) 2、代码实现 #include <stdio.h>int num = 0; //递归实现斐波那契数 // n <=2, f(n) = 1, n > 2 f(n) = f(n - 1) + f(); long fibonacci(int n) {//计算fibonacci(3)计算了多少次if (n == 3)num++;if (n <= 2){p…

同事都说有SQL注入风险,我非说没有

前言现在的项目&#xff0c;在操作数据库的时候&#xff0c;我都喜欢用ORM框架&#xff0c;其中EF是一直以来用的比较多的&#xff1b;EF 的封装的确让小伙伴一心注重业务逻辑就行了&#xff0c;不用过多的关注操作数据库的具体细节。但是在某些场景会选择执行SQL语句&#xff…

​【v2.x OGE-example 第二节】 实体参数

【v2.x OGE-example 第二节】 实体参数1. 位置&#xff1a;Drawing_example --> SpriteParameters2. 类名&#xff1a;SpriteParameters(1)旋转精灵&#xff1a;sprite.setRotation(float pRotation) 设置旋转角度sprite.setRotationCenter(float pRotationCenterX, float p…

王道408数据结构——第七章 查找

文章目录一、基本概念二、顺序查找&#xff08;线性查找&#xff09;一般线性表的顺序查找有序表的顺序查找二、折半查找&#xff08;二分查找&#xff09;三、分块查找&#xff08;索引顺序查找&#xff09;四、B树五、B树六、散列表构造散列函数1. 直接定址法2. 除留取余法3.…

L1-004.计算摄氏温度

给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C 5*(F-32)/9。题目保证输入与输出均在整型范围内。 输入格式&#xff1a; 输入在一行中给出一个华氏温度。 输出格式&#xff1a; 在一行中按照格式“Celsius C”输出对…

C和指针之函数之可变参数

1、可变参数如何实现 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,这个头文件声明了一个类型va_list和三个宏,va_start、va_arg、va_end,一般我们声明一个类型为va_list的变量,和这个几个宏配合使用,访问参数的值。 2、实现一个函数多个参数求均值 比…

hadoop:could only be replicated to 0 nodes, instead of 1

在Hadoop的环境搭建过程中&#xff0c;常常会遇到类似这样的错误信息提示&#xff1a;“could only be replicated to 0 nodes, instead of 1 ”&#xff0c;产生这样的错误原因有多种&#xff0c;这里列举出以下四种常用的解决方法以供参考&#xff1a; 确保master&#xff08…

System.Type类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace ConsoleApplication1 {class Program{static void Main(string[] args){//System.Type类//获取指向任何给定的类型…

.NET6之MiniAPI(二十三):Refit

本篇是与上篇HttpClient有关联的&#xff0c;有前篇中&#xff0c;我们是直接使用HttpClient来发出请求的&#xff0c;所有的请求信息都是我们根据需要自己来填充的。那Refit是什么呢&#xff1f;它是一个让我们调用API就像调用一个对象的方法一样简单&#xff0c;是通过把http…

设置utf8编码问题

注意&#xff1a;乱码和request的具体实现类有关&#xff0c;现在已经查到的是RequestDispatcher.forward调用前使用的是org.apache.catalina.connector.RequestFacade类而RequestDispatcher.forward调用后使用的是org.apache.catalina.core.ApplicationHttpRequest&#xff0c…

王道408数据结构——第八章 排序

文章目录一、排序定义二、插入排序——直接插入排序1. 描述2. 代码和示例3. 空间效率4. 时间效率5. 稳定性6. 适用性三、插入排序——折半插入排序1. 描述2. 时间效率3. 稳定性四、插入排序——希尔排序&#xff08;缩小增量排序&#xff09;1. 描述2. 代码和示例3. 空间效率4.…

C和指针之函数之递归实现厄密多项式

1、厄密多项式介绍 /*Hermite Polynomials(厄密多项式)是这样定义的1 ,n < 0Hn(x) 2x ,n 12xHn-1(x) - 2(n-1)Hn-2(x) ,n > 2*/ 2、代码实现 #include <stdio.h>/*Hermite Polynomials(厄密多项式)是这样定义的…

设置状态栏和导航栏

// 初始化导航栏外观效果 - (void)initialNavigationBarStyle { // 1. 获取导航栏的外观代理对象 UINavigationBar *navBar [UINavigationBar appearance]; // 2. 设置背景图片 [navBar setBackgroundImage:[UIImage imageNamed:"NavBar64"] forBarMetrics:UIBarMet…

PHP 长文章分页函数

<?php function ff_page($content,$page) { global $expert_id; $PageLength 2000; //每页字数 $CLength strlen($content); $PageCount floor(($CLength / $PageLength)) 1; //计算页数 $PageArrayarray(); $Seperator array("n","r","。&q…

Avalonia跨平台入门第二十一篇之玩耍CEF

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题;今…

golang实现自定义驱动的Cache

近期在写 ActivedRouter项目的时候需求一个缓存模型&#xff0c;要求缓存模型支持不同驱动,例如:memory、file、redis、mysql&#xff0c;实现思路代码如下: cache.go文件,定义缓存对外接口 //ActivedRouter //Author:usher.yue //Amail:usher.yuegmail.com //TencentQQ:422366…

C和指针之函数之求最大公约数

1、求最大公约数 求公约数的规则如下/*** M % N 0 : N*gcd(M, N) * M % N R, R > 0 : gcd(N, R)*/ 2、代码实现 #include <stdio.h> /*** M % N 0 : N*gcd(M, N) * M % N R, R > 0 : gcd(N, R)*/int gcd(int …

关于c#调用c编译器

这个已经过了好久了具体的实现代码没得&#xff0c;但是大致思路自己整理了一下&#xff1a; 首先要调用c编译器&#xff0c;process.start&#xff08;&#xff09;&#xff1b; 之后需要自己来进行编译器对代码执行的命令。 转载于:https://www.cnblogs.com/why1115/p/481032…