最近在工作上的專案遇到需要注入同一個Interface的多個Class,覺得一行一行加有點麻煩,未來新增Class也還要記得來補注入,後來查了官方文件後,加上一點Reflection技巧就可以達到一次注入多個Class囉
範例程式中我使用ASP.NET Core 專案來示範,Interface為 ISample
,搭配兩個Class(SampleA
與SampleB
),這兩個Class都有實作 ISample
找出需要注入的Class且有實作Interface的Type
在Startup.cs
,利用Reflection的方式找出需要注入的型別
1 | var settingTypes = typeof(ISample).Assembly.GetTypes() |
建立ServiceDescriptor後 加入IServiceCollection
接著建立ServiceDescriptor
指定ServiceType、ImplementType、ServiceLifetime,在加入到IServiceCollection1
2
3
4
5foreach (var type in settingTypes)
{
var serviceDescriptor = new ServiceDescriptor(typeof(ISample), type, ServiceLifetime.Scoped);
services.Add(serviceDescriptor);
}
利用ServiceDescriptor注入的方式也等同於 service.Add{Lifetime}注入
到這邊注入的部分就完成了
實際執行範例程式 可以看到Controller的Contructor有成功取得多個實體
就可以依照不同輸入參數取得不同的實體執行
最後附上範例程式:
範例程式
參考資料:
.NET Core 中的相依性插入