[.NET Core]一次注入實作同一個Interface的多個Class

最近在工作上的專案遇到需要注入同一個Interface的多個Class,覺得一行一行加有點麻煩,未來新增Class也還要記得來補注入,後來查了官方文件後,加上一點Reflection技巧就可以達到一次注入多個Class囉

範例程式中我使用ASP.NET Core 專案來示範,Interface為 ISample,搭配兩個Class(SampleASampleB),這兩個Class都有實作 ISample

找出需要注入的Class且有實作Interface的Type

Startup.cs,利用Reflection的方式找出需要注入的型別

1
2
var settingTypes = typeof(ISample).Assembly.GetTypes()
.Where(item => item.GetInterfaces().Contains(typeof(ISample)));

建立ServiceDescriptor後 加入IServiceCollection

接著建立ServiceDescriptor 指定ServiceType、ImplementType、ServiceLifetime,在加入到IServiceCollection

1
2
3
4
5
foreach (var type in settingTypes)
{
var serviceDescriptor = new ServiceDescriptor(typeof(ISample), type, ServiceLifetime.Scoped);
services.Add(serviceDescriptor);
}

利用ServiceDescriptor注入的方式也等同於 service.Add{Lifetime}注入
到這邊注入的部分就完成了

實際執行範例程式 可以看到Controller的Contructor有成功取得多個實體

就可以依照不同輸入參數取得不同的實體執行

最後附上範例程式:
範例程式

參考資料:
.NET Core 中的相依性插入