2015-10-04 3 views
5

में ऑटोफैक निर्भरता इंजेक्शन का उपयोग कैसे करें मैं सफलता के बिना अपने उपभोक्ता वर्ग के साथ DI का उपयोग करने की कोशिश कर रहा हूं।MassTransit IConsume

मेरे उपभोक्ता वर्ग:

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

    } 
} 

जब मैं बस कारखाने पंजीकृत करना चाहते उपभोक्ता एक parameterless निर्माता होना आवश्यक है।

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

किसी भी मदद की सराहना की जाएगी, मैं वास्तव में मेरे उपभोक्ता रजिस्टर करने के लिए पता नहीं कैसे ...

धन्यवाद

उत्तर

7

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); 
+0

हाय क्रिस, यह अब मेरे लिए काम कर रहा है। Masstransit.Autofac पैकेज इसे वास्तव में आसान बनाता है और masstransit भयानक है। धन्यवाद! – JoyC

+0

क्रिस पैटरसन, आपके उत्तर में कोड ऐसा लगता है कि काम नहीं कर रहा है। संदर्भ। रिसाव करें - लेकिन आपने आईसीन्स्यूमर फैक्टरी पंजीकृत की है। जब मैंने इसे बदल दिया, तो मुझे रिज़ॉल्यूशन समस्या मिली: Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'प्रकार पर' MassTransit.AutofacIntegration.AutofacConsumerFactory'1 – flamedmg

+0

इस तरह प्रयास करें: https://github.com/MassTransit/MassTransit/blob /develop/src/MassTransit.Host/ContainerBuilderExtensions.cs#L28 –

संबंधित मुद्दे