依賴注入簡(jiǎn)單介紹:
依賴注入(Dependency injection , DI)是一種實(shí)現(xiàn)對(duì)象及其合作者或依賴項(xiàng)之間松散耦合的技術(shù)。將類用來(lái)執(zhí)行其操作的這些對(duì)象以某種方式提供給該類,而不是直接實(shí)例化合作者或使用靜態(tài)引用。
ASP.NET Core DI 一般使用構(gòu)造函數(shù)注入獲取對(duì)象,比如在ConfigureServices配置注入后,通過(guò)下面方式獲取:
private IValueService _valueService;public ValueController(IValueService valueService){ _valueService = valueService;}那如果手動(dòng)獲取注入對(duì)象呢?
第一種獲取方式(有時(shí)會(huì)獲取不到,不推薦使用):
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}補(bǔ)充:需要注意的是,使用ServiceLocator.Instance.GetService<T>(); ,只能獲取AddTransient和AddSingleton注入的對(duì)象,而不能獲取AddScoped(請(qǐng)求生命周期內(nèi)唯一)注入的對(duì)象,不是不能獲取,而是獲取的和構(gòu)造函數(shù)獲取的不是相同對(duì)象,也就是說(shuō)獲取的對(duì)象沒(méi)有共享,使用場(chǎng)景比如IUnitOfWork。
那怎么手動(dòng)獲取請(qǐng)求生命周期內(nèi)的注入對(duì)象呢?方法如下:
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 程序包下。
參考資料:
Accessing IServiceProvider in static context No way to get scope for current http request (Autofac 4)?總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)錯(cuò)新站長(zhǎng)站的支持。
新聞熱點(diǎn)
疑難解答
圖片精選