在 MassTransit 消费者中注入依赖项

Inject dependencies inside MassTransit consumer

public class CreatePersonHandler : IConsumer<CreatePerson>
    {
        private readonly IUnitOfWork _unitOfWork;
        private readonly IMapper _mapper;

        public CreatePersonHandler(IUnitOfWork _unitOfWork, IMapper mapper)
        {
            _unitOfWork = unitOfWork;
            _mapper = mapper;
        }

        public Task Consume(ConsumeContext<CreatePerson> context)
        {
            ...
            Person person = _mapper.Map<Person>(context.Message);
            _unitOfWork.Persons.Add(person);
        }
    }

在 Program Main 方法中的其他服务中,我正在尝试注册此消费者 CreatePersonH​​andler ...

var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
            {
                cfg.Host(...);
                cfg.ReceiveEndpoint("persons", x =>
                {
                    ...
                    x.ConfigureConsumer<CreatePerson>(); // how to inject dependencies here?
                });
            });
    var cancToken = new CancellationTokenSource(TimeSpan.FromSeconds(15));
    await bus.StartAsync(cancToken);
    ...

我无法在线 e.ConfigureConsumer<CreatePerson>() 配置消费者,因为我需要注入 IUnitOfWorkIMapper。如何从这里做到这一点?如果我从消费者那里删除依赖项,解决方案将编译并且 运行 没有错误。

您应该为 MassTransit 使用正确的配置:

services.AddMassTransit(x =>
{
    x.AddConsumer<CreatePersonHandler>();

    x.UsingRabbitMq((context, cfg) => cfg.ConfigureEndpoints(context));
});

然后,只需确保您的依赖项已在容器中注册。例如:

services.AddScoped<IUnitOfWork, UnitOfWork>();

您可以read the documentation了解更多详情。