C# 从程序集加载MassTransit使用者

C# 从程序集加载MassTransit使用者,c#,.net,masstransit,C#,.net,Masstransit,从程序集加载MT使用者时(使用StructureMapcontainer/MassTransit.StructureMapintegration nuget package),消息得到部分处理:总线处理存储在队列中的消息,之后不响应,尽管您可以看到添加到队列中的消息。然后,如果重新启动应用程序,它将处理队列中等待的消息,并且不再执行任何操作 以下是设置: public class Application { public static void Main() { var

从程序集加载MT使用者时(使用
StructureMap
container/
MassTransit.StructureMap
integration nuget package),消息得到部分处理:总线处理存储在队列中的消息,之后不响应,尽管您可以看到添加到队列中的消息。然后,如果重新启动应用程序,它将处理队列中等待的消息,并且不再执行任何操作

以下是设置:

public class Application {
    public static void Main() {
        var container = new Container();

        container.Configure(c => c.Scan(scan => {
            scan.TheCallingAssembly();
            scan.AddAllTypesOf<IConsumer>();
        }));

        var bus = ServiceBusFactory.New(sbc => {
            sbc.UseRabbitMq();
            sbc.ReceiveFrom("rabbitmq://localhost/app_commands");
            sbc.Subscribe(x => x.LoadFrom(container));
            sbc.Validate();
        });

        container.Inject(bus);

        Console.WriteLine("* mt bus has been registered");
        Console.ReadKey();
    }
}

您需要确保StructureMap不会过早结束
IServiceBus
(即
IDisposable
)的生命周期。当您将
IServiceBus
注入耗电元件时,很可能在处理耗电元件时,总线正在关闭

因此,
container.Inject()
可能需要一些附加属性,以避免被StructureMap处理


此外,您还可以使用
IConsumeContext
获取
IServiceBus
(使用
Bus
属性),因此无需将其注入消费者。

是的,
LoadFrom
是永久性的。
sbc.Subscribe(x => x.Consumer<SendDocumentCommandHandler>().Permanent());
public class SendDocumentCommandHandler : Consumes<SendDocumentCommand>.All {
    private IServiceBus bus;

    public void Consume(SendDocumentCommand message) {
        Console.WriteLine("Message of type: {0} has been consumed", message.GetType().Name);
    }

    public SendDocumentCommandHandler() { }

    public SendDocumentCommandHandler(IServiceBus bus) {
        this.bus = bus;
    }
}