.NET Core中的一个接口多种实现的依赖注入与动态选择

最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这时候就在想能不能实现动态的选择使用哪种实现呢?如果可以的话那么我只需要在配置文件中进行相应的配置即可获取到正确的实现方法的调用,这样的话岂不快哉!今天我们就来一起探讨下实现这种需求的几种实现方式吧。

作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/10236163.html

代码演示

在开始实现的方式之前,我们先模拟下代码。由于真实系统的结构比较复杂,所以这里我就单独建一个类似的项目结构代码。项目如下图所示:

640?wx_fmt=png

接下来我来详细说下上面的结果作用及代码。

  1. MultiImpDemo.I 这个项目是接口项目,里面有一个简单的接口定义ISayHello,代码如下:

        public interface ISayHello{        string Talk();}

    很简单,就一个模拟讲话的方法。

  2. MultiImpDemo.A 这个类库项目是接口的一种实现方式,里面有一个SayHello类用来实现ISayHello接口,代码如下:

    640?wx_fmt=png

  3. MultiImpDemo.B 这个类库项目是接口的另一种实现方式,里面也有一个SayHello类用来实现ISayHello接口,代码如下:


    640?wx_fmt=png

  4. MultiImpDemo.Show 这个就是用来显示我们模拟效果的API项目,首选我们在ConfigureServices中加入如下的代码来进行上述两种实现方式的注入:

    640?wx_fmt=png

  5. 在api实现里面获取服务并进行模拟调用:


640?wx_fmt=png

代码很简单对不对?你应该看的懂吧,这时候我们运行起来项目,然后访问API'api/values'这个接口,结果总是显示如下的结果:

640?wx_fmt=png

两种需求对应两种实现

这里有两种业务需求!第一种业务中只需要对其中一种实现方式进行调用,如:业务需要SqlServer数据库的实现就行了。第二种是业务中对这两种实现方式都有用到,如:业务急需要用到Oracle的数据库实现同时也有用到SqlServer的数据库实现,需要同时往这两个数据库中插入相同的数据。下面分别对这两种需求进行解决。

业务中对这两种实现方式都有用到

针对这种情况有如下两种实现方式:

  1. 第二种实现方式

    其实,在ASP.NET Core中,当你对一个接口注册了多个实现的时候,构造函数是可以注入一个该接口集合的,这个集合里是所有注册过的实现。

    下面我们先改造下ConfigureServices,分别注入下这两种实现

    640?wx_fmt=png

    接着继续改造下注入的方式,这里我们直接注入IEnumerable<ISayHello>如下代码所示:

    640?wx_fmt=png

    然后运行起来看下效果吧

    640?wx_fmt=png

  2. 利用AddTransient的扩展方法public static IServiceCollection AddTransient<TService>(this IServiceCollection services, Func<IServiceProvider, TService> implementationFactory) where TService : class;然后根据我们的配置的实现来进行服务实现的获取。下面就让我们利用代码来实现一番吧:

    640?wx_fmt=png

    然后我们具体调用的依赖注入的方式需要变化一下:


    640?wx_fmt=png

    然后运行看下效果吧:

    640?wx_fmt=png

    可以看到A跟B的实现都获取到了!效果实现!

业务只需要对其中一种实现方式的调用

这时候我们可以根据我们预设的配置来动态获取我们所需要的实现。这段话说的我自己都感觉拗口。话不多少,开鲁吧!这里我将介绍三种实现方式。

  1. 根据我们的配置文件中设置的key来进行动态的注入。

    这种方式实现之前首先得进行相应的配置,如下所示:

      "CommonSettings": {    "ImplementAssembly": "MultiImpDemo.A"}

    然后在注入的时候根据配置进行动态的进行注入:

     services.AddTransient<ISayHello, A.SayHello>();            services.AddTransient<ISayHello, B.SayHello>();

    然后在服务调用的时候稍作修改:

    640?wx_fmt=png

    OK,到这里运行一下看下效果吧!然后改下配置文件再看下效果!

    640?wx_fmt=png

  2. 第二种实现方式,即接口参数的方式这样可以避免上个方法中反射所带来的性能损耗。

    这里我们改造下接口,接口中加入一个程序集的属性,如下所示:

    public interface ISayHello{        string ImplementAssemblyName { get; }        string Talk();}

    对应的A跟B中的实现代码也要少做调整:

    A:

     public string ImplementAssemblyName => "MultiImpDemo.A";        
    public string Talk(){            return "Talk from A.SayHello";}

    B:

     public string ImplementAssemblyName => "MultiImpDemo.B";       
     public string Talk(){            return "Talk from B.SayHello";}

    然后,在实现方法调用的时候稍微修改下:

    640?wx_fmt=png

    效果自己运行下看下吧!

  3. 第三种实现是根据配置进行动态的注册

    首先修改下ConfigureServices方法:

    640?wx_fmt=png

  4. 这样的话就会根据我们的配置文件来进行动态的注册,然后我们像往常一样进行服务的调取即可:

      private readonly ISayHello _sayHello;        public ValuesController(ISayHello sayHello)        {_sayHello = sayHello;}        // GET api/values[HttpGet]        public ActionResult<IEnumerable<string>> Get(){            return new string[] { _sayHello.Talk() };}

    运行即可得到我们想要的效果!

总结

本文从具体的业务需求入手,根据需求来或动态的进行对应服务的获取,或同时使用两个不同的实现!希望对您有所帮助!如果您有更多的实现方法可以在下方留言,或者加入.NET Core实战千人群跟637326624大伙进行交流,最后感谢您的阅读!


640?wx_fmt=jpeg


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

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

相关文章

Sightseeing Cows POJ - 3621

题意&#xff1a; L个点&#xff0c;P边的点边带权的有向图&#xff0c;求一个环点权和与边权和比值的最大值。 题解&#xff1a; 01分数规划判负环 详细看这里 还是套用01分数规划模型&#xff0c;点权为value[i],边权为cost[u],一个环为C&#xff0c;问题要求最大化 最…

C# Memory Cache 踩坑记录

背景前些天公司服务器数据库访问量偏高,运维人员收到告警推送,安排我团队小伙伴排查原因.我们发现原来系统定期会跑一个回归测试,该测运行的任务较多,每处理一条任务都会到数据库中取相关数据,高速地回归测试也带来了高频率的数据库读取.解决方案1我们认为每个任务要取的数据大…

[贪心专题]CF549G,CF351E,CF226D,CF1276C,CF1148E,CF798D

文章目录T1&#xff1a;CF1276C Beautiful RectangletitlesolutioncodeT2&#xff1a;CF226D The tabletitlesolutioncodeT3&#xff1a;CF549G Happy LinetitlesolutioncodeT4&#xff1a;CF798D Mike and distributiontitlesolutioncodeT5&#xff1a;CF351E Jeff and Permut…

【数位DP】CF 54C,509C,431D,628D,855E,1245F,95D

这一次有题解了&#xff01;&#xff01;T1&#xff1a;CF54C First Digit LawtitlesolutioncodeT2&#xff1a;CF509C Sums of DigitstitlesolutioncodeT3&#xff1a;CF431D Random TasktitlesolutioncodeT4&#xff1a;CF628D Magic NumberstitlesolutioncodeT5&#xff1a;…

C#如何安全、高效地玩转任何种类的内存之Memory(三)

前言我们都知道&#xff0c;.Net Core是微软推出的一个通用开发平台&#xff0c;它是跨平台和开源的&#xff0c;由一个.NET运行时、一组可重用的框架库、一组SDK工具和语言编译器组成&#xff0c;旨在让.Net developers可以更容易地编写高性能的服务应用程序和基于云的可伸缩服…

.netcore下的微服务、容器、运维、自动化发布

微服务1.1 基本概念1.1.1 什么是微服务&#xff1f;微服务架构是SOA思想某一种具体实现。是一种将单应用程序作为一套小型服务开发的方法&#xff0c;每种应用程序都在其自己的进程中运行&#xff0c;并采用轻量级的通讯机制&#xff08;TCP&#xff09;进行通信。这…

[选拔赛1]花园(矩阵快速幂),JM的月亮神树(最短路),保护出题人(斜率优化)

多年不考试&#xff0c;一夜回到解放前T1&#xff1a;花园titlesolutioncodeT2&#xff1a;月亮神树titlesolutioncodeT3&#xff1a;保护出题人titlesolutioncodeT1&#xff1a;花园 title 小 L 有一座环形花园&#xff0c;沿花园的顺时针方向&#xff0c;他把各个花圃编号为…

.NET的关于人脸识别引擎分享(C#)

最近在Github上找合适的人脸识别引擎&#xff0c;想要本地化用&#xff0c;不用开放的一些API&#xff08;比如腾讯AI、百度AI&#xff09;,有些场景联不了网&#xff0c;一开始搜索的是时候&#xff08;关键字&#xff1a;face recognition&#xff09;就找到了最出名的face_r…

UOJ#84-[UR #7]水题走四方【dp】

正题 题目链接:https://uoj.ac/problem/84 题目大意 有nnn个点的一棵树&#xff0c;111为根&#xff0c;两个人从根节点往下走&#xff08;只能从深度小的点走到深度大的点&#xff09;。 两个人每一秒都可以一条边&#xff08;也可以不移动&#xff09;&#xff0c;或者不消…

Docker最全教程——数据库容器化(十一)

终于按时完成第二篇。本来准备着手讲一些实践&#xff0c;但是数据库部分没有讲到&#xff0c;部分实践会存在一些问题&#xff0c;于是就有了此篇以及后续——数据库容器化。本篇将从SQL Server容器化实践开始&#xff0c;并逐步讲解其他数据库的容器化实践&#xff0c;中间再…

[选拔赛2 NOIP2018雅礼集训 Day3 u,v,w]玩个三角形(二维差分),玩个球(状压DP+map),玩个树(树上DP)

文章目录T1&#xff1a;玩个三角形titlesolutioncodeT2&#xff1a;玩个球titlesolutioncodeT3&#xff1a;玩个树titlesolutioncodeT1&#xff1a;玩个三角形 title 题目描述 考虑一个 n ∗ n 的矩阵 A&#xff0c;初始所有元素均为 0。 执行 q 次如下形式的操作&#xff…

2019 年起如何开始学习 ABP 框架系列文章-开篇有益

阅读文本大概需要 3.3 分钟。本系列文章推荐阅读地址为&#xff1a;52ABP 开发文档https://www.52abp.com/Wiki/52abp/latest/Welcome-to-52abp本文的目的是为了让刚刚接触 ABP 框架的同学或者准备接触 ABP 框架的同学&#xff0c;能够理解和搞明白 ABP 框架到底是怎么回事&…

【模板】差分约束算法

【模板】差分约束算法 题意&#xff1a; 题解&#xff1a; 模板题 算法讲解 给出一组包含 m 个不等式&#xff0c;有 n 个未知数。求任意一组满足这个不等式组的解&#xff0c;或判定无解。 连边之后跑最短路&#xff0c;保证每个连通块都没有负环即可。 也可以建源点s 0&a…

数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

打死没想到会在H老师处学懂数论同余&#xff0c;整除模运算埃式筛法欧拉筛法最大公约数和最小公倍数辗转相除法更相减损术裴蜀定理威尔逊定理费马定理同余等价类、剩余系、缩系欧拉函数欧拉定理扩展欧拉定理区间逆元扩展欧几里得中国剩余定理扩展中国剩余定理利用以上所有知识进…

AT4437-[AGC028C]Min Cost Cycle【结论,堆】

正题 题目链接:https://www.luogu.com.cn/problem/AT4437 题目大意 有nnn个点的一张有向完全图&#xff0c;每个点有两个点权a,ba,ba,b。连接x,yx,yx,y两个点的边权为min{ax,by}min\{a_x,b_y\}min{ax​,by​}&#xff0c;求一条权值和最小的哈密顿回路。 1≤n≤105,1≤a,b≤1…

某银行大型管理系统端到端持续集成和交付实践

背景传统的银行IT系统研发流程从需求提出到产品交付往往具有较长的研发周期&#xff0c;纵观银行当下面临的市场环境&#xff0c;个人信贷消费升级&#xff0c;资管需求旺盛&#xff0c;普惠金融成为国家战略&#xff0c;来自银行同业和互联网金融的压力扑面而来&#xff0c;谁…

排列组合十一个性质公式及证明,错排数公式及证明

文章目录排列数组合数求组合数常用公式定义式递推式杨辉三角组合数常用性质及证明性质一性质二性质三性质四(二项式定理)性质五性质六性质七性质八性质九性质十性质十一错排数排列数 从nnn个物品中不放回地依次选mmm个物品&#xff0c;考虑顺序&#xff0c;有多少种方案&#…

引入用于 Azure IoT Edge 的 Visual Studio 工具

物联网开发人员&#xff1a;工具和经验引入用于 Azure IoT Edge 的 Visual Studio 工具今天&#xff0c;我们很高兴地发布用于 Visual Studio 2017 的 Azure IoT Edge 工具的预览版。Azure IoT Edge 是一个全托管服务&#xff0c;通过直接在跨平台物联网设备上部署并运行人工智…

P4878 [USACO05DEC]Layout G

P4878 [USACO05DEC]Layout G 题意&#xff1a; 题解&#xff1a; 这个题其实是差分约束的裸题&#xff0c;但是有几个坑要注意 1.题目说了&#xff0c;奶牛按照编号1…N排列&#xff0c;对于ML个输入&#xff0c;A< B ,所以关系是B - A < 10,而不是A - B <10,我一开…

【学习笔记】原根 / BSGS / 扩展BSGS证明及模板

文章目录原根BSGS大步小步算法扩展BSGS原根 如果两个整数a,ba,ba,b互质&#xff0c;则有aϕ(b)%b1a^{\phi(b)}\%b1aϕ(b)%b1 定义模bbb意义下的aaa的阶为使ad%b1a^d\%b1ad%b1的最小正整数ddd 显然&#xff0c;模bbb的阶d∣ϕ(b)d|\phi(b)d∣ϕ(b) 如果模bbb意义下aaa的阶为…