Использование Ninject с обработчиками сообщений EasyNetQ / RabbitMQ

Я пытаюсь использовать EasyNetQ с Ninject для записи сообщений.

Мне удалось настроить 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 (Ugh), то он заработает. Обработчик называется нормально, и я могу найти свой репозиторий через 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)<---

person MindingData    schedule 04.11.2014    source источник


Ответы (1)


Итак, я решил это. Очевидно, когда 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, вероятно, должен будет делать это автоматически. Очевидно, что если вы установите фабрику на использование Ninject, скорее всего, ваш обработчик тоже захочет использовать Ninject.

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

person MindingData    schedule 05.11.2014
comment
Спасибо, что вернулись, чтобы ответить на вопрос. Запрос на вытягивание объединен! - person Mike Hadlow; 08.11.2014