1)net framework使用 Castle.Windsor 做DI,其中有个批量注入功能;
比如注入所有ICmd实现的类型;
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<ISubscriber>().ImplementedBy<TopicSubscriber>().LifestyleSingleton())
.Register(Classes.FromThisAssembly().BasedOn<ICmd>().WithService.FromInterface().LifestyleTransient())
.Register(Component.For<ConsumerService>().LifestyleSingleton());
}
2)net6 自带的DI不支持批量注入见,利用反射注入
Assembly assembly = Assembly.GetAssembly(typeof(ICmd)) ?? throw new ArgumentNullException(nameof(Assembly));
Type[] allExportedType = assembly.GetExportedTypes()?? throw new ArgumentNullException(nameof(Type));
IEnumerable<Type> allAbsCmdBaseSubClassTypes = (allExportedType.Where(y => (y.IsClass && (y.IsSubclassOf(typeof(ICmd))) && !y.IsAbstract && !y.IsGenericType && !y.IsNested))) ?? throw new ArgumentNullException(nameof(ICmd));
foreach(var absCmdBaseClass in allAbsCmdBaseSubClassTypes)
{
container.AddScoped(typeof(ICmd), absCmdBaseClass);
}