ASP.NET Core 的動態 DI - 不同 Controller 取得不同 instance
當我們對同一個 Interface 實作不同的類別,而且這個需求是針對不同的 controller 而設(也可以當做是針對不同的使用者),要怎麼做呢?其實方式很簡單。
Startup.cs 設定
在 Startup.cs 中,加入下列程式碼:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IService, ServiceB>();
services.AddTransient<ServiceA>();
services.AddTransient(x => new HomeController(x.GetRequiredService<ILogger<HomeController>>(), (IService)x.GetService<ServiceA>()));
services.AddMvc().AddControllersAsServices();
services.AddControllersWithViews();
}
重點在於services.AddTransient(x => new HomeController(x.GetRequiredService<ILogger<HomeController>>(), (IService)x.GetService<ServiceA>()));
這一行,將 controller 跟要對應的類別做 mapping,最後別忘了services.AddMvc().AddControllersAsServices();
這一行,不然不會有任何作用。
這樣在 HomeController 中就會取得 ServiceA,其它的 Controller 一律取得 ServiceB。
參考資料