iT邦幫忙

0

.net core 2.1 DI (dependency injection)的三種注入方式有什麼不同嗎?

deh 2020-11-27 16:19:142374 瀏覽

在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;

目前個人使用上感覺都一樣,
是否隨意選擇即可?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

7
石頭
iT邦高手 1 級 ‧ 2020-11-27 19:00:25
最佳解答
  1. Constructor injection
//在Controller內建構給所有action使用
private readonly IDataService _dataService;

public HomeController(IDataService dataService)
{
    _dataService = dataService;
}
  1. Method injection
//在action的arg使用[FromServices]
public IActionResult Index([FromServices] IDataService dataService2)
  1. Service locator
//從RequestServices拿
IDataService dataService3 = HttpContext.RequestServices.GetService(typeof(IDataService)) as IDataService;

Service_locator_pattern


假如都有註冊的話,在使用上的話三個是沒有什麼差別.

我個人優先會使用第一種Constructor injection

我個人會避免第三種方式來使用DI容器,因為Service locator無法很容易進行單元測試(Service locator強依賴於DI容器)

所有DI容器都是為了解決物件中的依賴和物件生命週期,我之前也寫關於Autofac (IOC)容器介紹
, 雖然不是介紹.net core DI但核心概念是一樣的

deh iT邦研究生 1 級 ‧ 2020-11-30 08:13:09 檢舉

感謝解惑!

我要發表回答

立即登入回答