依赖注入简单介绍:
依赖注入(dependency injection , di)是一种实现对象及其合作者或依赖项之间松散耦合的技术。将类用来执行其操作的这些对象以某种方式提供给该类,而不是直接实例化合作者或使用静态引用。
asp.net core di 一般使用构造函数注入获取对象,比如在configureservices配置注入后,通过下面方式获取:
private ivalueservice _valueservice; public valuecontroller(ivalueservice valueservice) { _valueservice = valueservice; }
那如果手动获取注入对象呢?
第一种获取方式(有时会获取不到,不推荐使用):
var services = new servicecollection(); var provider = services.buildserviceprovider(); var _valueservice = provider.getservice<ivalueservice>();
第二种获取方式(推荐使用):
public void configure(iapplicationbuilder app) { servicelocator.instance = app.applicationservices; } public static class servicelocator { public static iserviceprovider instance { get; set; } } public void somerandommethod() { var valueservice = servicelocator.instance.getservice<ivalueservice>(); // do something with service }
补充:需要注意的是,使用servicelocator.instance.getservice<t>();
,只能获取addtransient和addsingleton注入的对象,而不能获取addscoped(请求生命周期内唯一)注入的对象,不是不能获取,而是获取的和构造函数获取的不是相同对象,也就是说获取的对象没有共享,使用场景比如iunitofwork。
那怎么手动获取请求生命周期内的注入对象呢?方法如下:
using microsoft.aspnetcore.http; using microsoft.extensions.dependencyinjection; namespace sample.domain { public class sampledomainservice : idomainservice { private iunitofwork _unitofwork; public sampledomainservice(ihttpcontextaccessor httpcontextaccessor) { _unitofwork = httpcontextaccessor.httpcontext.requestservices.getservice<iunitofwork>(); } } }
ihttpcontextaccessor接口在microsoft.aspnetcore.http.abstractionsnuget
程序包下。
参考资料:
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。
如对本文有疑问, 点击进行留言回复!!
《CTF特训营》web部分读书笔记(二)跨站脚本攻击(XSS)
国密SM1\ SM2\ SM3\ SM4\ SSF33算法和国际RSA算法的对应关系
网友评论