MassTransit настроен с помощью StructureMap - ContainerScoped не работает - PullRequest
0 голосов
/ 06 марта 2020

Я настроил класс X с ContainerScope в моей конфигурации StructureMap, но по какой-то причине, когда приложение изначально запускается, и потребитель MassTransit использует начальное сообщение, оно создает экземпляр, но в последующих сообщениях, полученных для этого потребителя, потребитель воссоздается, но не объект X (я ожидаю, что для каждого полученного сообщения будет создан новый экземпляр). Я знаю, что если я настрою его как временный, он будет работать, но я просто хочу, чтобы один экземпляр этого класса был создан для всей обработки этого сообщения.

Любая помощь с этим будет принята с благодарностью.

1 Ответ

1 голос
/ 06 марта 2020

При использовании MassTransit создание нового экземпляра потребителя является предпочтительным поведением для каждого сообщения. Рекомендуется, чтобы любое состояние или поведение, которое необходимо поддерживать как один экземпляр в сообщениях, выполнялось с использованием зависимости этого потребителя (которая может быть настроена в контейнере разработчиком приложения).

Я понимаю, что вы спрашиваете, как настроить своего потребителя как одноэлементный, и вы, вероятно, можете это выяснить, но MassTransit перенастроит контейнер, чтобы сделать его областью действия для каждого сообщения, если вы используете AddMassTransit / AddConsumer.

Лучший подход - настроить ваше состояние:

public interface IConsumerState
{
}

public class ConsumerState :
    IConsumerState
{
}

x.For<IConsumerState>().Use<ConsumerState>().Singleton();

Затем для MassTransit настройте своего потребителя так, чтобы он зависел от этого интерфейса.

public class Consumer :
    IConsume<Message>
{
    public Consumer(IConsumerState state)
    {
        _state = state;
    }

    public async Consume(ConsumeContext<Message> context)
    {
    }
}

x.AddMassTransit(m =>
{
    m.AddConsumer<Consumer>();
    m.AddBus(provider => Bus.Factory.CreateUsingInMemory(cfg =>
    {
        cfg.ConfigureEndpoints();
    }
});

Использование При таком подходе для каждого сообщения создается новый потребитель, а состояние поддерживается / используется всеми экземплярами потребителя.

...