我正在开发一个使用MassTransit
中的RabbitMQ
和C#
消费消息的项目
我正在构建原型,现在消费者项目是一个控制台应用程序。在Main program.cs
类中,我连接到总线并订阅接受来自发布者的消息,如下所示:
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;
}
以下是其中一个消费者类的示例:
class UpdatedInformationConsumer : Consumes<UpdatedInformation>.Context
{
public void Consume(IConsumeContext<UpdatedInformation> message)
{
Console.Write("\nMessage: " + message.Message);
Console.Write("\nPROCESSED: " + DateTime.Now.ToString());
}
}
在订阅者的主类中,我还初始化服务和其他配置。我需要做的是能够访问我的消费者类中的那些服务/对象,因为我不想在每次消费时收到消息时初始化新的服务/对象。
这应该相对简单,但我很难过,因为我实际上并没有创建我的消费者类的实例。
答案 0 :(得分:3)
您可以在订阅中指定一个将这些依赖项传递给您的使用者的消费者工厂,而不是在您的服务中放置一堆单例,这会产生一堆静态方法等等。您还可以使用任何受支持的容器(甚至是您自己的容器)来解决这些依赖关系。
x.Subscribe<UpdatedInformationConsumer>(() =>
new UpdatedInformationConsumer(dependency1, dependency2, etc));
将为每个接收消息创建一个新的使用者实例,因此也可以通过这种方式管理对象生命周期。