Próbuję użyć DI z moją klasą konsumencką bez powodzenia.Jak używać wtrysku Autofac Dependency w MassTransit IConsume
Moja klasa konsumentów:
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();
}
}
Kiedy chcę zarejestrować fabrykę autobusów konsument musi mieć konstruktora bez parametrów.
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>();
Każda pomoc będzie mile widziane, ja naprawdę nie wiem, jak się zarejestrować konsumenta ...
Dzięki
Cześć Chris, to teraz pracuje dla mnie. Pakiet masstransit.Autofac sprawia, że jest naprawdę łatwy i masstransit jest niesamowity. Dzięki! – JoyC
Chris Patterson, kod w twojej odpowiedzi wydaje się nie działa. context.Resolve - ale zarejestrowałeś IConsumerFactory. Kiedy to zmieniłem, mam problem z rozdzielczością: Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'on type' MassTransit.AutofacIntegration.AutofacConsumerFactory'1 –
flamedmg
Spróbuj tego: https://github.com/MassTransit/MassTransit/blob /develop/src/MassTransit.Host/ContainerBuilderExtensions.cs#L28 –