.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了 (3)

1546871452531

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

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

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"; }

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

private readonly ISayHello sayHello; public ValuesController(IEnumerable<ISayHello> sayHellos,IConfiguration configuration) { sayHello = sayHellos.FirstOrDefault(h => h.ImplementAssemblyName == configuration.GetSection("CommonSettings:ImplementAssembly").Value); } // GET api/values [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { sayHello.Talk() }; }

效果自己运行下看下吧!

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

首先修改下ConfigureServices方法:

var implementAssembly = Configuration.GetSection("CommonSettings:ImplementAssembly").Value; if (string.IsNullOrWhiteSpace(implementAssembly)) throw new ArgumentNullException("CommonSettings:ImplementAssembly未配置"); if (implementAssembly.Equals("MultiImpDemo.A")) { services.AddTransient<ISayHello, A.SayHello>(); } else { services.AddTransient<ISayHello, B.SayHello>(); }

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

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大伙进行交流,最后感谢您的阅读!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyddxw.html