При использовании 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();
}
});
Использование При таком подходе для каждого сообщения создается новый потребитель, а состояние поддерживается / используется всеми экземплярами потребителя.