2015-10-04 13 views
5

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

Odpowiedz

7

Integracja z Autofac jest łatwe, istnieją metody przedłużania paczkowane MassTransit.Autofac które pomagają.

Po pierwsze, istnieje AutofacConsumerFactory, który usunie klientów z pojemnika. Można dodać do pojemnika, albo można to zarejestrować się używając:

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

Następnie w rachunku budowniczy na autobus i otrzymać końcowy:

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

Będzie to rozwiązać swoich konsumentów pojemnik.

Aktualizacja:

nowsze wersje MassTransit dodać otrzymać punkty końcowe tak:

e.Consumer<TakeMeasureConsumer>(context); 
+0

Cześć Chris, to teraz pracuje dla mnie. Pakiet masstransit.Autofac sprawia, że ​​jest naprawdę łatwy i masstransit jest niesamowity. Dzięki! – JoyC

+0

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

+0

Spróbuj tego: https://github.com/MassTransit/MassTransit/blob /develop/src/MassTransit.Host/ContainerBuilderExtensions.cs#L28 –

Powiązane problemy