C# 将打开的泛型类型注册为简单注入器的备用类型 设置
我正在.NET4.0上运行一个web应用程序,该应用程序使用。我正在使用,在为命令处理程序配置依赖项时遇到问题 示例代码 以下是班级结构的分类:C# 将打开的泛型类型注册为简单注入器的备用类型 设置,c#,.net,dependency-injection,simple-injector,C#,.net,Dependency Injection,Simple Injector,我正在.NET4.0上运行一个web应用程序,该应用程序使用。我正在使用,在为命令处理程序配置依赖项时遇到问题 示例代码 以下是班级结构的分类: 接口ICommandHandler { 无效句柄(T命令); } 枚举日志状态{成功,失败} 接口ICommandLogger { 无效日志(LoggingState状态,T命令); } 类NullCommandLogger:ICommandLogger { 无效日志(LoggingState状态,T命令) { //故意留白 } } 装饰师: //
接口ICommandHandler
{
无效句柄(T命令);
}
枚举日志状态{成功,失败}
接口ICommandLogger
{
无效日志(LoggingState状态,T命令);
}
类NullCommandLogger:ICommandLogger
{
无效日志(LoggingState状态,T命令)
{
//故意留白
}
}
装饰师:
//
///围绕每个
///命令处理程序。
///
类LoggingCommandHandlerDecorator:ICommandHandler
{
私有只读ICommandHandler;
专用只读ICommandLogger记录器;
公共日志CommandHandlerDecorator(
ICommandHandler,
ICommandLogger(记录器)
{
这是装饰过的;
this.logger=记录器;
}
公共无效句柄(TCommand命令)
{
尝试
{
这个.修饰的.句柄(命令);
}
捕获(例外)
{
this.logger.Log(LoggingState.Failed,命令);
投掷;
}
this.logger.Log(LoggingState.Success,命令);
}
}
在myCompositionRoot中,我将其配置如下:
var assembly=/*获取处理程序所在的程序集*/
//注册所有显式定义的记录器
容器寄存器(类型(ICommandLogger),组件);
//为所有其他对象注册空对象
容器注册表条件(
类型(ICommandLogger),
类型(NullCommandLogger),
ctx=>!ctx.Handled);
//使用日志记录包装所有命令处理程序
container.RegisterDecorator(
类型(ICommandHandler),
类型(LoggingCommandHandlerDecorator));
这对于像这样的非通用记录器非常有效:
类工作记录器:ICommandLogger{/*…*/}
问题
现在,我有了一组实现标记接口的命令,这样我就可以使用一个单独的记录器来处理所有的标记接口-但SimpleInjector不会接受这一点:
class NotWorkingLogger:ICommandLogger
其中T:IMarkerInterface{/*…*/}
我知道这不应该是一个差异问题,但我已经尝试使用的只是为了确保,但没有任何效果
是否有办法配置此方案?您只需按如下方式添加NotWorkingLogger
的注册:
container.Register(typeof(ICommandLogger<>), assembly);
// It's added between the two other registrations
container.RegisterConditional(
typeof(ICommandLogger<>),
typeof(NotWorkingLogger<>),
ctx => !ctx.Handled);
container.RegisterConditional(
typeof(ICommandLogger<>),
typeof(NullCommandLogger<>),
ctx => !ctx.Handled);
container.Register(typeof(ICommandLogger),assembly);
//它是在另外两个注册之间添加的
容器注册表条件(
类型(ICommandLogger),
类型(非工作记录器),
ctx=>!ctx.Handled);
容器注册表条件(
类型(ICommandLogger),
类型(NullCommandLogger),
ctx=>!ctx.Handled);
Ahh,太简单了:-D.谢谢!