具有多个接口的Autofac Open Generic Decorator导致循环依赖关系解决

时间:2019-05-15 15:51:45

标签: c# dependency-injection decorator autofac

我有以下接口:

public interface ICommandHandler<T>
{
    void Handle(T command);
}

public class TransactionalCommandHandlerDecorator<T> : ICommandHandler<T>
{
    private readonly ICommandHandler<T> _handler;
    public TransactionalCommandHandlerDecorator(ICommandHandler<T> handler)
    {
        _handler = handler;
    }
    public void Handle(T command)
    {
    }
}

我有一个具体的类,它实现了两个命令处理程序:

public class Handler : ICommandHandler<CreateLocation>
                        ,ICommandHandler<ModifyLocation>
{
    public void Handle(CreateLocation command)
    {

    }

    public void Handle(ModifyLocation command)
    {
    }
}

我的注册如下:

 builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
            .AsClosedTypesOf(typeof(ICommandHandler<>))
            .InstancePerLifetimeScope();

    builder.RegisterGenericDecorator(typeof(TransactionalCommandHandlerDecorator<>), typeof(ICommandHandler<>));

解析'Handler'类会使autofac在无限循环中循环解析decorater和handler,从而导致StackOverflowException。如果我更改了“处理程序”以仅实现一个接口,那么它将正常工作。

关于如何解决该问题的任何想法?

1 个答案:

答案 0 :(得分:0)

这是bug,将在以后的Autofac版本中解决。该修补程序似乎需要对API的另一部分进行重大更改,因此需要作为v5.0的一部分发布。

同时,解决此问题的一种方法是创建单独的注册。

var builder = new ContainerBuilder();
builder.RegisterType<Handler>().As<ICommandHandler<CreateLocation>>();
builder.RegisterType<Handler>().As<ICommandHandler<ModifyLocation>>();
builder.RegisterGenericDecorator(typeof(TransactionalCommandHandlerDecorator<>), typeof(ICommandHandler<>));
var container = builder.Build();

var instance = container.Resolve<ICommandHandler<CreateLocation>>();