我正在使用MassTransit使用RabbitMQ发布\订阅消息。我想在使用者中注入依赖,以便使用者可以将数据插入数据库。但是,我发现文档中的示例令人困惑。
public class MessageConsumer : IConsumer<Message>
{
private IDao dao;
public MessageConsumer(IDao dao)
{
this.dao = dao;
}
public async Task Consume(ConsumeContext<Message> context)
{
Console.WriteLine("Order Submitted: {0}", context.Message.MessageId);
}
}
总线配置如下
static void Main(string[] args)
{
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterType<ConcreteDao>().As<IDao>();
builder.RegisterType<MessageConsumer>().As<IConsumer<Message>>();
builder.AddMassTransit(x => {
// add the bus to the container
x.UsingRabbitMq((context, cfg) => {
cfg.Host("localhost");
cfg.ReceiveEndpoint("MessageQueueName", ec => {
// Configure a single consumer
ec.ConfigureConsumer<MessageConsumer>(context);
});
// or, configure the endpoints by convention
cfg.ConfigureEndpoints(context);
});
});
var container = builder.Build();
var bc = container.Resolve<IBusControl>();
bc.Start();
}
但是解决IBusControl时出现异常。
System.ArgumentException: 'The consumer type was not found: StationDashboard.Messaging.Consumer.OperationModeChangedConsumer (Parameter 'T')'
上面的代码有什么问题?向消费者注入依赖的最佳方法是什么?如果有完整的工作样本,将会有所帮助。
答案 0 :(得分:0)
您需要按照documentation中的说明注册使用者。
不要不要执行以下操作:
builder.RegisterType<MessageConsumer>().As<IConsumer<Message>>();
相反,如文档中所示,执行以下操作:
x.AddConsumer<MessageConsumer>();
您的依赖项可以在完成注册后注册。