4

Ninject で EasyNetQ を使用してメッセージを記録しようとしています。

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. 
    }
}

パラメーターなしのコンストラクターを追加し、代わりに ServiceLocator (Ugh) を介して Ninject を使用できるように設定すると、機能します。ハンドラーは正常に呼び出され、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

1 に答える 1