ASP.NET Core DI手動獲取注入對象的方法
依賴注入簡單介紹:
依賴注入(Dependency injection , DI)是一種實現(xiàn)對象及其合作者或依賴項之間松散耦合的技術。將類用來執(zhí)行其操作的這些對象以某種方式提供給該類,而不是直接實例化合作者或使用靜態(tài)引用。
ASP.NET Core DI 一般使用構(gòu)造函數(shù)注入獲取對象,比如在ConfigureServices配置注入后,通過下面方式獲?。?/p>
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(請求生命周期內(nèi)唯一)注入的對象,不是不能獲取,而是獲取的和構(gòu)造函數(shù)獲取的不是相同對象,也就是說獲取的對象沒有共享,使用場景比如IUnitOfWork。
那怎么手動獲取請求生命周期內(nèi)的注入對象呢?方法如下:
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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
asp.net下使用Request.From獲取非服務器控件的值的方法
asp.net下使用Request.From獲取非服務器控件的值的方法,需要的朋友可以參考下。2010-03-03
Visual Studio IDE編寫程序時不顯示窗口或窗口一閃而逝的解決方法
這篇文章主要為大家詳細介紹了Visual Studio IDE編寫程序時不顯示窗口或窗口一閃而逝的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09
asp.net 請求輸入到輸出的全過程及httpHandler和httpModuler詳細介紹
看了幾篇講述httpHandler和HttpModuler的文章,雖然說沒有完全了解底層操作,但是我也算明白了一個請求從進入IIS到最后輸出都經(jīng)歷了哪些過程,感興趣的朋友可以了解下2013-01-01
如何使用Python實現(xiàn)阿拉伯數(shù)字轉(zhuǎn)換成中國漢字
本文提供了一個Python代碼示例,用于將阿拉伯數(shù)字轉(zhuǎn)換為中文漢字表示,代碼定義了數(shù)字到漢字的映射表,并實現(xiàn)了處理不同位數(shù)(如個、十、百、千、萬等)的函數(shù),特別地,處理方式包括對大數(shù)字的分解和轉(zhuǎn)換,以及對連續(xù)零的特殊處理,感興趣的朋友跟隨小編一起看看吧2024-09-09
asp.net如何將DataSet轉(zhuǎn)換成josn并輸出
將DataSet轉(zhuǎn)換成josn并輸出,如果解析有問題可以把代碼中的"用"替換,需要的朋友可以參考下2014-08-08

