RegisterGenericDecorator 忽略条件

RegisterGenericDecorator ignores condition

条件:

我有一个通用命令处理程序:

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 回购上提出问题。