文章出處

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>();,只能獲取AddTransientAddSingleton注入的對象,而不能獲取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 程序包下。

參考資料:


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()