2015-10-04 41 views
5

Sto provando a utilizzare DI con la mia classe consumer senza successo.Come utilizzare Autofac Dipendenza iniezione in MassTransit IConsume

La mia classe di consumatori:

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(); 

    } 
} 

Quando voglio registrare la fabbrica di autobus il consumatore deve avere un costruttore senza parametri.

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>(); 

Qualsiasi aiuto sarebbe apprezzato, io davvero non so come registrare il mio comportamento dei ...

Grazie

risposta

7

Integrazione con Autofac è facile, ci sono metodi di estensione nel pacchetto MassTransit.Autofac che aiuta.

In primo luogo, c'è uno AutofacConsumerFactory che risolverà i vostri consumatori dal contenitore. È possibile aggiungere questo al contenitore, oppure è possibile registrarsi da soli utilizzando:

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

Poi, nella dichiarazione del costruttore per il bus e ricevere endpoint:

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

Questo sarà quindi risolvere i vostri consumatori Il container.

Aggiornamento:

Per le versioni più recenti di MassTransit aggiungere ricevere endpoint come questo:

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

Ciao Chris, questo sta lavorando per me. Il pacchetto di masstransit.Autofac lo rende davvero facile e il trasferimento di massa è fantastico. Grazie! – JoyC

+0

Chris Patterson, il codice nella tua risposta sembra non funzionare. context.Resolve - ma hai registrato IConsumerFactory. Quando ho cambiato, ho il problema della risoluzione: Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'sul tipo' MassTransit.AutofacIntegration.AutofacConsumerFactory'1 – flamedmg

+0

Prova in questo modo: https://github.com/MassTransit/MassTransit/blob /develop/src/MassTransit.Host/ContainerBuilderExtensions.cs#L28 –