在大众运输中使用Autofac向消费者注入依赖

时间:2020-07-07 04:37:09

标签: c# rabbitmq autofac masstransit

我正在使用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')'

上面的代码有什么问题?向消费者注入依赖的最佳方法是什么?如果有完整的工作样本,将会有所帮助。

1 个答案:

答案 0 :(得分:0)

您需要按照documentation中的说明注册使用者。

不要不要执行以下操作:

builder.RegisterType<MessageConsumer>().As<IConsumer<Message>>();

相反,如文档中所示,执行以下操作:

x.AddConsumer<MessageConsumer>();

您的依赖项可以在完成注册后注册。