Autofac Open Generic Decorator с несколькими интерфейсами вызывает циклическое разрешение зависимостей - PullRequest
2 голосов
/ 15 мая 2019

У меня есть следующие интерфейсы:

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<>));

Преобразование класса «Обработчик» приводит к тому, что autofac циклически разрешает декоратор и обработчик в бесконечном цикле, что вызывает исключение StackOverflowException.если я изменю «обработчик» для реализации только одного интерфейса, то он будет работать без проблем.

есть идеи, как это исправить?

1 Ответ

0 голосов
/ 26 мая 2019

Это ошибка , и она будет устранена в будущем выпуске 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>>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...