2015-10-04 12 views
5

私の消費者クラスでDIを使用しようとしています。MassTransit IConsumeでAutofac Dependency Injectionを使用する方法

私の消費者クラス:私はバス工場を登録したい場合は

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との統合

おかげ

答えて

7

が簡単で、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); 
+0

こんにちはクリス、これが今の私のために働いています。 masstransit.Autofacパッケージは本当に簡単で、masstransitはすばらしいです。ありがとう! – JoyC

+0

Chris Patterson、答えのコードが機能していないようです。 context.Resolve - IConsumerFactoryを登録しました。私がそれを変更したとき、解決の問題があります:Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'on type' MassTransit.AutofacIntegration.AutofacConsumerFactory'1 – flamedmg

+0

このようにしてみてください:https://github.com/MassTransit/MassTransit/blob /develop/src/MassTransit.Host/ContainerBuilderExtensions.cs#L28 –

関連する問題