在 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 方法中的其他服务中,我正在尝试注册此消费者 CreatePersonHandler
...
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>()
配置消费者,因为我需要注入 IUnitOfWork
和 IMapper
。如何从这里做到这一点?如果我从消费者那里删除依赖项,解决方案将编译并且 运行 没有错误。
您应该为 MassTransit 使用正确的配置:
services.AddMassTransit(x =>
{
x.AddConsumer<CreatePersonHandler>();
x.UsingRabbitMq((context, cfg) => cfg.ConfigureEndpoints(context));
});
然后,只需确保您的依赖项已在容器中注册。例如:
services.AddScoped<IUnitOfWork, UnitOfWork>();
您可以read the documentation了解更多详情。
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 方法中的其他服务中,我正在尝试注册此消费者 CreatePersonHandler ...
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>()
配置消费者,因为我需要注入 IUnitOfWork
和 IMapper
。如何从这里做到这一点?如果我从消费者那里删除依赖项,解决方案将编译并且 运行 没有错误。
您应该为 MassTransit 使用正确的配置:
services.AddMassTransit(x =>
{
x.AddConsumer<CreatePersonHandler>();
x.UsingRabbitMq((context, cfg) => cfg.ConfigureEndpoints(context));
});
然后,只需确保您的依赖项已在容器中注册。例如:
services.AddScoped<IUnitOfWork, UnitOfWork>();
您可以read the documentation了解更多详情。