首页 > 解决方案 > 使用 StructureMap 配置的 MassTransit - ContainerScoped 不工作

问题描述

我在我的 StructureMap 配置中配置了一个带有 ContainerScope 的类 X,但是由于某种原因,当应用程序最初启动并且 MassTransit 消费者使用初始消息时,它会创建实例,但是在为该消费者接收到的后续消息中,消费者是重新创建,但不是对象 X(我希望每个收到的消息都会创建一个新实例)。我知道如果我用瞬态配置它会起作用,但我只想要为该消息的整个处理创建该类的单个实例。

对此的任何帮助将不胜感激。

标签: structuremapmasstransit

解决方案


使用 MassTransit 时,创建新的消费者实例是每条消息的首选行为。建议使用该消费者的依赖项(可以由应用程序开发人员在容器中配置)来完成需要跨消息作为单个实例维护的任何状态或行为。

我意识到您在询问如何将您的使用者配置为单例,您可能会弄清楚,但如果您使用 AddMassTransit/AddConsumer,MassTransit 将重新配置容器以使其适用于每条消息。

更好的方法是配置您的状态:

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

使用这种方法,为每条消息创建一个新的消费者,并由所有消费者实例维护/共享状态。


推荐阅读