從設定檔動態取得型別並註冊

在 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();
    }
}

參考資料