當我們對同一個 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。

參考資料