ASP.NET Core 的 DI 小技巧
從設定檔動態取得型別並註冊
在 ASP.NET Core 中已經內建 DI,算是相當的方便。一般來說,Interface 跟實作的類別都是一對一,但有些情況下,一個 Interface 可能會同時實作多個類別(例如為了客製化),這個時候可以利用設定檔這個小技巧來調整要註冊的型別:
設定檔:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ServiceSelect": "MultipleImplementationsDIDemoWebAP.Services.ServiceB"
}
動態註冊:
public void ConfigureServices(IServiceCollection services)
{
string serviceFullTypeName = Configuration.GetSection("ServiceSelect").Value;
Type serviceType = Type.GetType(serviceFullTypeName);
services.AddTransient(typeof(IService), serviceType);
services.AddControllersWithViews();
}
這樣的方式,就可以不用分版本,只要改設定檔,就可以出貨給不同客戶。
在 Controller 一次取得多個同 Interface 的實作類別
還有另一種方式,就是在 Controller 取得所有 instance,再依條件去取得自己要的 instance:
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly IService _service;
private IEnumerable<IService> _services { get; set; }
public HomeController(ILogger<HomeController> logger, IEnumerable<IService> services)
{
_logger = logger;
_services = services;
_service = services.Where(s => s.GetType().Name == "ServiceA").FirstOrDefault();
}
}
參考資料