2014-11-04 2 views
4

Я пытаюсь использовать EasyNetQ с Ninject для регистрации сообщений.Использование Ninject с обработчиками сообщений EasyNetQ/RabbitMQ

Мне удалось установить Ninject как EasyNetQ DI (я думаю), но когда сообщение приходит к обработчику без конструктора без параметров (например, мне нужна привязка репозитория там), он не разрешается. Или, по крайней мере, я считаю, что это проблема, так как я получаю довольно общую ошибку на консоли.

Я говорю EasyNetQ использовать Ninject так:

RabbitHutch.SetContainerFactory(() => new NinjectAdapter(container)); 

Я думаю, что это все, что мне нужно, чтобы установить его. Адаптер Ninject - один из EasyNetQ.

Мой обработчик выглядит следующим образом:

public class ProfileDeactivatedUpdateHandler : IConsume<ProfileDeactivatedUpdate> 
{ 
    private readonly IProfileRepository _profileRepository; 

    public ProfileDeactivatedUpdateHandler(IProfileRepository profileRepository) 
    { 
     _profileRepository = profileRepository; 
    } 

    public void Consume(ProfileDeactivatedUpdate message) 
    { 
     //Do Stuff. 
    } 
} 

Если добавить конструктор без параметров, и вместо установки Ninject быть доступны через ServiceLocator (Уф), то она работает. Обработчик называется штрафом, и я могу найти свой репозиторий через ServiceLocator, поэтому я знаю, что по крайней мере Ninject знает о репозитории.

Ошибка, возникающая при попытке обработать сообщение.

System.AggregateException: One or more errors occurred. ---> System.Exception: E 
xception of type 'System.Exception' was thrown. 
    at EasyNetQ.ReflectionHelpers.DefaultFactories`1.Get() 
    at EasyNetQ.ReflectionHelpers.CreateInstance[T]() 
    at EasyNetQ.AutoSubscribe.DefaultAutoSubscriberMessageDispatcher.Dispatch[TMe 
ssage,TConsumer](TMessage message) 
    at EasyNetQ.RabbitBus.<>c__DisplayClass6`1.<Subscribe>b__5(T msg) 
    --- End of inner exception stack trace --- 
---> (Inner Exception #0) System.Exception: Exception of type 'System.Exception' 
was thrown. 
    at EasyNetQ.ReflectionHelpers.DefaultFactories`1.Get() 
    at EasyNetQ.ReflectionHelpers.CreateInstance[T]() 
    at EasyNetQ.AutoSubscribe.DefaultAutoSubscriberMessageDispatcher.Dispatch[TMe 
ssage,TConsumer](TMessage message) 
    at EasyNetQ.RabbitBus.<>c__DisplayClass6`1.<Subscribe>b__5(T msg)<--- 

ответ

4

Так что я решил это. По-видимому, когда EasyNetQ создает экземпляр обработчика, он не использует указанную структуру DI для этого (Boo!). Вы должны отдельно указывать реализацию «MessageDispatcher». Потрясающие! О ... Но ... Существует только реализация для Autofac, а не для Ninject (Boo! X2).

Итак, мой запрос тянуть здесь для кода реализации диспетчеру событий для Ninject здесь: https://github.com/mikehadlow/EasyNetQ/pull/309

На данный момент, вы можете скопировать и вставить этот класс в ваш проект. Затем в NinjectModule или везде, где вы настраиваете ваши привязок, вы можете сделать следующее:

//Bind Message Dispatcher to Ninject event message dispatcher 
NinjectMessageDispatcher messageDispatcher = new NinjectMessageDispatcher(Kernel); 
Bind<IAutoSubscriberMessageDispatcher>().ToConstant(messageDispatcher); 

Тогда где бы вы настраиваете свои подписчик вы можете сделать что-то вроде следующего (Обратите внимание, что это авто подписок с помощью интерфейс IConsume из EasyNetQ.

var subscriber = new AutoSubscriber(_serviceBus, "ProfileServices"); 
subscriber.AutoSubscriberMessageDispatcher = _dispatcher; 
subscriber.Subscribe(Assembly.GetExecutingAssembly()); 

важная часть установки MessageDispatcher вручную экземпляр Ninject диспетчера. Как вы хотите, чтобы достичь этого до вас.

Я думаю, что в будущем, EasyNetQ p необходимо сделать это автоматически. Очевидно, если вы настроили фабрику на использование Ninject, скорее всего, ваш обработчик тоже захочет использовать Ninject.

Oh! И вы можете изменить приведенный выше код, чтобы использовать DI по вашему выбору. Это нужно сделать для ЛЮБОГО DI, используемого с EasyNetQ (я думаю), а не только для Ninject.

+0

Спасибо, что вернулись, чтобы ответить на вопрос. Запрос на утяжеление слился! –

Смежные вопросы