我正在尝试使用EasyNetQ和Ninject来记录消息。
我已经成功地将Ninject设置为EasyNetQ DI (我认为),但是当消息到达没有无参数构造函数的处理程序时(例如,我需要绑定在那里的存储库),它不会解析。或者至少我认为这就是问题所在,因为我在控制台上得到了一个相当通用的错误。
我告诉EasyNetQ像这样使用尼尼微:
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,那么它就能工作了。这个处理程序被称为fine,我可以通过ServiceLocator找到我的存储库,所以我知道尼尼微至少知道这个存储库。
试图处理消息时弹出的错误是。
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)<---发布于 2014-11-05 01:35:47
所以我已经解决了这个问题。显然,当EasyNetQ实例化处理程序时,它不会使用指定的DI框架来实现它(Boo!)。您必须分别指定"MessageDispatcher“实现。太棒了!哦..。但是..。只有一个实现的Autofac,而不是尼尼莫(Boo!x2)。
所以,在这里,我的拉请求是为了代码来实现尼尼姆的事件分派器,这里是: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。对于与EasyNetQ一起使用的任何DI (我认为)都需要这样做,而不仅仅是Ninject。
https://stackoverflow.com/questions/26744781
复制相似问题