如何在 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);
我正在尝试对我的消费者使用 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);