在Startup.cs內註冊Service後,
在Controller內使用DI有以下三種作法
//在Controller內建構給所有action使用
private readonly IDataService _dataService;
public HomeController(IDataService dataService)
{
_dataService = dataService;
}
//在action的arg使用[FromServices]
public IActionResult Index([FromServices] IDataService dataService2)
//從RequestServices拿
IDataService dataService3 = HttpContext.RequestServices.GetService(typeof(IDataService)) as IDataService;
目前個人使用上感覺都一樣,
是否隨意選擇即可?
//在Controller內建構給所有action使用
private readonly IDataService _dataService;
public HomeController(IDataService dataService)
{
_dataService = dataService;
}
//在action的arg使用[FromServices]
public IActionResult Index([FromServices] IDataService dataService2)
//從RequestServices拿
IDataService dataService3 = HttpContext.RequestServices.GetService(typeof(IDataService)) as IDataService;
假如都有註冊的話,在使用上的話三個是沒有什麼差別.
我個人優先會使用第一種Constructor injection
我個人會避免第三種方式來使用DI容器,因為Service locator無法很容易進行單元測試(Service locator強依賴於DI容器)
所有DI容器都是為了解決物件中的依賴和物件生命週期,我之前也寫關於Autofac (IOC)容器介紹
, 雖然不是介紹.net core DI但核心概念是一樣的