【问题标题】:Injecting dependency to consumers using Autofac in masstransit在公共交通中使用 Autofac 向消费者注入依赖项
【发布时间】:2020-07-07 04:37:09
【问题描述】:

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

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

【问题讨论】:

    标签: c# rabbitmq autofac masstransit


    【解决方案1】:

    您需要按照documentation 中的说明注册消费者。

    不要这样做:

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

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

    x.AddConsumer<MessageConsumer>();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多