我有以下接口:
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。如果我更改了“处理程序”以仅实现一个接口,那么它将正常工作。
关于如何解决该问题的任何想法?
答案 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>>();