访问 Consumer 中的对象

Access objects within a Consumer

我正在开发一个项目,该项目使用 MassTransitRabbitMQC#

中使用消息

我正在构建一个原型,现在消费者项目是一个控制台应用程序。在 Main program.cs class 中,我连接到总线并订阅以接受来自发布者的消息,如下所示:

var bus = BusInitializer.CreateBus("Subscriber", x =>
            {
                x.Subscribe(subs =>
                {
                    subs.Consumer<UpdatedInformation>().Permanent();
                });
            });

作为参考,这里是 CreateBus() 方法:

public static IServiceBus CreateBus(string queueName, Action<ServiceBusConfigurator> moreInitialization)
{
    var bus = ServiceBusFactory.New(x =>
    {
        x.UseRabbitMq();
        x.ReceiveFrom("rabbitmq://localhost/test" + queueName);
        moreInitialization(x);
    });

    return bus;
}

这是其中一位消费者的示例 classes:

class UpdatedInformationConsumer : Consumes<UpdatedInformation>.Context
{

    public void Consume(IConsumeContext<UpdatedInformation> message)
    {
        Console.Write("\nMessage: " + message.Message);
        Console.Write("\nPROCESSED: " + DateTime.Now.ToString());
    }
}

在订阅者的主class中,我还初始化了服务等配置。我需要做的是能够在我的消费者 classes 中访问那些 services/objects,因为我不想每次在消费中收到消息时都初始化新的。

这应该相对容易,但我很困惑,因为我实际上并没有创建我的消费者 classes 的实例。

与其在您的服务中放置一堆单例,这会导致一堆静态方法等,您可以在您的订阅中指定一个消费者工厂,将这些依赖项传递给您的消费者。您还可以使用任何受支持的容器(甚至您自己的容器)来解决这些依赖关系。

x.Subscribe<UpdatedInformationConsumer>(() => 
    new UpdatedInformationConsumer(dependency1, dependency2, etc));

每次接收消息都会创建一个新的消费者实例,因此对象生命周期也可以通过这种方式进行管理。