如何在 MassTransit IConsume 中使用 Autofac 依赖注入

How to use Autofac Dependency Injection in MassTransit IConsume

我正在尝试对我的消费者使用 DI class 但没有成功。

我的消费者class:

public class TakeMeasureConsumer : IConsumer<TakeMeasure>
{

    private IUnitOfWorkAsync _uow;
    private IInstrumentOutputDomainService _instrumentOutputDomainService;


    public TakeMeasureConsumer(IUnitOfWorkAsync uow,
        IInstrumentOutputDomainService instrumentOutputDomainService)
    {
        _uow = uow;
        _instrumentOutputDomainService = instrumentOutputDomainService;
    }


    public async Task Consume(ConsumeContext<TakeMeasure> context)
    {

        var instrumentOutput = Mapper.Map<InstrumentOutput>(context.Message);

        _instrumentOutputDomainService.Insert(instrumentOutput);
        await _uow.SaveChangesAsync();

    }
}

当我想注册总线工厂时,消费者必须有一个无参数的构造函数。

protected override void Load(ContainerBuilder builder)
{

    builder.Register(context =>
        Bus.Factory.CreateUsingRabbitMq(cfg =>
        {
            var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
            {
                h.Username("guest");
                h.Password("guest");
            });

            cfg.ReceiveEndpoint(host, "intrument_take_measure", e =>
            {
                // Must be a non abastract type with a parameterless constructor....
                e.Consumer<TakeMeasureConsumer>();

            });  

        }))
    .SingleInstance()
    .As<IBusControl>()
    .As<IBus>();
}

任何帮助将不胜感激,我真的不知道如何注册我的消费者...

谢谢

与 Autofac 集成很容易,MassTransit.Autofac 包中的扩展方法可以提供帮助。

首先,有一个 AutofacConsumerFactory 将从容器中解析您的使用者。您可以将其添加到容器中,也可以使用以下方式自行注册:

builder.RegisterGeneric(typeof(AutofacConsumerFactory<>))
    .WithParameter(new NamedParameter("name", "message"))
    .As(typeof(IConsumerFactory<>));

然后,在总线和接收端点的构建器语句中:

e.Consumer(() => context.Resolve<IConsumerFactory<TakeMeasureConsumer>());

这将从容器中解析您的消费者。

更新:

对于较新版本的 MassTransit 添加这样的接收端点:

e.Consumer<TakeMeasureConsumer>(context);