RegisterGenericDecorator 忽略条件
RegisterGenericDecorator ignores condition
条件:
- Autofac: 4.9.1
- .NET 框架:4.7.2
我有一个通用命令处理程序:
public interface ICommand<TResult> : IValidatableObject
{
}
public interface ICommandHandler<TCommand, TResult>
where TCommand : ICommand<TResult>, IValidatableObject
{
TResult Handle(TCommand command);
}
我有一个装饰器,我想用于 ICommandHandler 的多个(但不是全部)实现(我将使用自定义属性来区分处理程序):
public sealed class LoggingDecorator<TCommand, TResult> : ICommandHandler<TCommand, TResult>
where TCommand : ICommand<TResult>, IValidatableObject
{
private readonly ICommandHandler<TCommand, TResult> _handler;
public LoggingDecorator(ICommandHandler<TCommand, TResult> handler)
{
_handler = handler;
}
public TResult Handle(TCommand command)
{
var test = 0;
return _handler.Handle(command);
}
}
我正在尝试使用 AutoFac 注册它们,如下所示:
builder.RegisterAssemblyTypes(ThisAssembly)
.AsClosedTypesOf(typeof(ICommandHandler<,>))
.AsImplementedInterfaces();
builder.RegisterGenericDecorator(
decoratorType: typeof(LoggingDecorator<,>),
serviceType: typeof(ICommandHandler<,>),
condition: _decoratorContext =>
{
return false; // true;
});
似乎忽略了条件,装饰器总是“分配”给所有处理程序。
我是否错误地配置了 AutoFac 中的注册?还是我漏掉了什么?
RegisterGenericDecorator方法中returns'false'条件如何实现不注册装饰器?
Autofac 4.9.1 现在是一个很旧的版本(3 年以上)。我知道围绕装饰器条件的一些行为在 v6.0.0 中得到了修复;查看 this issue 升级解决了某人的问题,这听起来与您的问题相似。
我建议升级到最新版本;如果升级不能解决问题,请整理一个最小的复现并在我们的 github 回购上提出问题。
条件:
- Autofac: 4.9.1
- .NET 框架:4.7.2
我有一个通用命令处理程序:
public interface ICommand<TResult> : IValidatableObject
{
}
public interface ICommandHandler<TCommand, TResult>
where TCommand : ICommand<TResult>, IValidatableObject
{
TResult Handle(TCommand command);
}
我有一个装饰器,我想用于 ICommandHandler 的多个(但不是全部)实现(我将使用自定义属性来区分处理程序):
public sealed class LoggingDecorator<TCommand, TResult> : ICommandHandler<TCommand, TResult>
where TCommand : ICommand<TResult>, IValidatableObject
{
private readonly ICommandHandler<TCommand, TResult> _handler;
public LoggingDecorator(ICommandHandler<TCommand, TResult> handler)
{
_handler = handler;
}
public TResult Handle(TCommand command)
{
var test = 0;
return _handler.Handle(command);
}
}
我正在尝试使用 AutoFac 注册它们,如下所示:
builder.RegisterAssemblyTypes(ThisAssembly)
.AsClosedTypesOf(typeof(ICommandHandler<,>))
.AsImplementedInterfaces();
builder.RegisterGenericDecorator(
decoratorType: typeof(LoggingDecorator<,>),
serviceType: typeof(ICommandHandler<,>),
condition: _decoratorContext =>
{
return false; // true;
});
似乎忽略了条件,装饰器总是“分配”给所有处理程序。 我是否错误地配置了 AutoFac 中的注册?还是我漏掉了什么?
RegisterGenericDecorator方法中returns'false'条件如何实现不注册装饰器?
Autofac 4.9.1 现在是一个很旧的版本(3 年以上)。我知道围绕装饰器条件的一些行为在 v6.0.0 中得到了修复;查看 this issue 升级解决了某人的问题,这听起来与您的问题相似。
我建议升级到最新版本;如果升级不能解决问题,请整理一个最小的复现并在我们的 github 回购上提出问题。