Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将打开的泛型类型注册为简单注入器的备用类型 设置_C#_.net_Dependency Injection_Simple Injector - Fatal编程技术网

C# 将打开的泛型类型注册为简单注入器的备用类型 设置

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命令) { //故意留白 } } 装饰师: //

我正在.NET4.0上运行一个web应用程序,该应用程序使用。我正在使用,在为命令处理程序配置依赖项时遇到问题

示例代码 以下是班级结构的分类:

接口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,命令);
}
}
在my
CompositionRoot中,我将其配置如下:

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.谢谢!