C# SimpleInjector:通过适配器注册集合

C# SimpleInjector:通过适配器注册集合,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,使用SimpleInjector,您可以注册以下类型的集合: 接口ILogger{} 类文件记录器:ILogger{} 类SqlLogger:ILogger{} //用法 var container=新容器(); container.Collection.Register(typeof(FileLogger),typeof(SqlLogger)); container.GetAllInstances();//返回两个iLogger 有了它,我想用一个我可以在整个应用程序中使用的抽象MyLogg

使用SimpleInjector,您可以注册以下类型的集合:

接口ILogger{}
类文件记录器:ILogger{}
类SqlLogger:ILogger{}
//用法
var container=新容器();
container.Collection.Register(typeof(FileLogger),typeof(SqlLogger));
container.GetAllInstances();//返回两个iLogger
有了它,我想用一个我可以在整个应用程序中使用的抽象
MyLogger
来包装这样的
ILogger

接口MyLogger{
}
类日志适配器:MyLogger{
公共日志适配器(ILogger记录器){}
}
但是,我无法让容器将记录器适配器注册为已注册的
ILogger
s:

var container=newcontainer();
container.Collection.Register(typeof(FileLogger),typeof(SqlLogger));
容器.集合.寄存器(typeof(ILogger));
//ArgumentException:提供的类型ILogger不从MyLogger继承。
//参数名称:serviceTypes
虽然异常消息很清楚(
ILogger
没有继承自
LoggerAdapter
),但我觉得SimpleInjector应该能够从
ILogger
s创建
LoggerAdapter
s,只需将那些
ILogger
s注入
LoggerAdapter
s即可


有没有一种干净的方法来注册这些适配器的集合?

这里有多种解决方案。我想到的第一件事是将适配器更改为接受记录器列表:

类日志适配器:MyLogger
{
公共日志适配器(IEnumerable Logger){}
}
这可能是一个更令人愉快的解决方案,因为它允许您将单个
MyLogger
注入到您的消费者中,而不是必须注入一组
MyLogger
实例

如果您确实需要
MyLogger
实例列表,可以按如下方式手动注册集合:

container.RegisterSingleton(
()=>container.GetAllInstances()
。选择(记录器=>new LoggerAdapter(记录器));

如果您只需
注册()
,然后尝试
获取实例()
,您将获得所需的适配器及其
ILogger
。唯一的问题是您正在注册
ILogger
的多个实现,而容器无法知道您要将哪个实现注入
LoggerAdapter
。是的,因此我试图从容器中获得的是一组
LoggerAdapter
实例,用于收集我已注册的
ILogger
s。因此,在这个示例中,我将得到两个实例,
LoggerAdapter(FileLogger)
LoggerAdapter(SqlLogger)
。难道你不能注册一个工厂,它接受一个
ILogger
集合并返回一个经过调整的
ILogger
集合吗?请显示完整的
LoggerAdapter
,因为当前提供的代码没有实现
iLoggerAdapter
,然后更改构造函数以接受一个集合:
LoggerAdapter>(IEnumerable Logger){}
感谢您的回复,SimpleInjector,使用它非常有趣。答案确实适用于我发布的示例。但是在我的实际代码中,
ILogger
LoggerAdapter
MyLogger
类型在同一类型的
T
上是通用的。您发布的第一个选项仍然有效k和是我现在使用的。但是为了满足语义的需要,我想使用第二种选择,但我不知道如何在泛型上实现。例如;
typeof(IEnumerable)
将不是有效的代码。@bouke:如果您的类型是泛型的,则第二种解决方案不可行。我可以编写一些其他解决方案,但tbh,我认为您应该使用第一种解决方案,因为该类已经充当了适配器。该类确实是适配器,但我希望在该适配器的使用者中保留语义;它应该是aware是“许多消费者”(适配器)的一员。我很想看看这会是什么样子。