网站建设 百度贴吧北京给网站做系统的公司名称
网站建设 百度贴吧,北京给网站做系统的公司名称,建设网站用户名是什么原因,网页设计心得体会正文最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式#xff0c;为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中#xff0c;但是在服务调用的时候总是获取到最后注入的那个方法的实现#xff0c;这时候就在想能不能实现动态的选… 最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中但是在服务调用的时候总是获取到最后注入的那个方法的实现这时候就在想能不能实现动态的选择使用哪种实现呢如果可以的话那么我只需要在配置文件中进行相应的配置即可获取到正确的实现方法的调用这样的话岂不快哉今天我们就来一起探讨下实现这种需求的几种实现方式吧。作者依乐祝原文地址https://www.cnblogs.com/yilezhu/p/10236163.html代码演示在开始实现的方式之前我们先模拟下代码。由于真实系统的结构比较复杂所以这里我就单独建一个类似的项目结构代码。项目如下图所示接下来我来详细说下上面的结果作用及代码。MultiImpDemo.I 这个项目是接口项目里面有一个简单的接口定义ISayHello代码如下 public interface ISayHello{ string Talk();}很简单就一个模拟讲话的方法。MultiImpDemo.A 这个类库项目是接口的一种实现方式里面有一个SayHello类用来实现ISayHello接口,代码如下MultiImpDemo.B 这个类库项目是接口的另一种实现方式里面也有一个SayHello类用来实现ISayHello接口,代码如下MultiImpDemo.Show 这个就是用来显示我们模拟效果的API项目首选我们在ConfigureServices中加入如下的代码来进行上述两种实现方式的注入在api实现里面获取服务并进行模拟调用代码很简单对不对你应该看的懂吧这时候我们运行起来项目然后访问APIapi/values这个接口结果总是显示如下的结果两种需求对应两种实现这里有两种业务需求第一种业务中只需要对其中一种实现方式进行调用如业务需要SqlServer数据库的实现就行了。第二种是业务中对这两种实现方式都有用到如业务急需要用到Oracle的数据库实现同时也有用到SqlServer的数据库实现需要同时往这两个数据库中插入相同的数据。下面分别对这两种需求进行解决。业务中对这两种实现方式都有用到针对这种情况有如下两种实现方式第二种实现方式其实在ASP.NET Core中当你对一个接口注册了多个实现的时候构造函数是可以注入一个该接口集合的这个集合里是所有注册过的实现。下面我们先改造下ConfigureServices,分别注入下这两种实现接着继续改造下注入的方式这里我们直接注入IEnumerableISayHello如下代码所示然后运行起来看下效果吧利用AddTransient的扩展方法public static IServiceCollection AddTransientTService(this IServiceCollection services, FuncIServiceProvider, TService implementationFactory) where TService : class;然后根据我们的配置的实现来进行服务实现的获取。下面就让我们利用代码来实现一番吧然后我们具体调用的依赖注入的方式需要变化一下然后运行看下效果吧可以看到A跟B的实现都获取到了效果实现业务只需要对其中一种实现方式的调用这时候我们可以根据我们预设的配置来动态获取我们所需要的实现。这段话说的我自己都感觉拗口。话不多少开鲁吧这里我将介绍三种实现方式。根据我们的配置文件中设置的key来进行动态的注入。这种方式实现之前首先得进行相应的配置如下所示 CommonSettings: { ImplementAssembly: MultiImpDemo.A}然后在注入的时候根据配置进行动态的进行注入 services.AddTransientISayHello, A.SayHello(); services.AddTransientISayHello, B.SayHello();然后在服务调用的时候稍作修改OK,到这里运行一下看下效果吧然后改下配置文件再看下效果第二种实现方式即接口参数的方式这样可以避免上个方法中反射所带来的性能损耗。这里我们改造下接口接口中加入一个程序集的属性如下所示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;}然后在实现方法调用的时候稍微修改下效果自己运行下看下吧第三种实现是根据配置进行动态的注册首先修改下ConfigureServices方法这样的话就会根据我们的配置文件来进行动态的注册然后我们像往常一样进行服务的调取即可 private readonly ISayHello _sayHello; public ValuesController(ISayHello sayHello) {_sayHello sayHello;} // GET api/values[HttpGet] public ActionResultIEnumerablestring Get(){ return new string[] { _sayHello.Talk() };}运行即可得到我们想要的效果总结本文从具体的业务需求入手根据需求来或动态的进行对应服务的获取或同时使用两个不同的实现希望对您有所帮助如果您有更多的实现方法可以在下方留言或者加入.NET Core实战千人群跟637326624大伙进行交流最后感谢您的阅读
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89550.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!