首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EasyNetQ/RabbitMQ消息处理程序中使用Ninject

在EasyNetQ/RabbitMQ消息处理程序中使用Ninject
EN

Stack Overflow用户
提问于 2014-11-04 20:51:20
回答 1查看 1.2K关注 0票数 4

我正在尝试使用EasyNetQ和Ninject来记录消息。

我已经成功地将Ninject设置为EasyNetQ DI (我认为),但是当消息到达没有无参数构造函数的处理程序时(例如,我需要绑定在那里的存储库),它不会解析。或者至少我认为这就是问题所在,因为我在控制台上得到了一个相当通用的错误。

我告诉EasyNetQ像这样使用尼尼微:

代码语言:javascript
复制
RabbitHutch.SetContainerFactory(() => new NinjectAdapter(container));

我想这就是我所需要的。Ninject适配器是来自EasyNetQ的适配器。

我的处理程序如下所示:

代码语言:javascript
复制
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找到我的存储库,所以我知道尼尼微至少知道这个存储库。

试图处理消息时弹出的错误是。

代码语言:javascript
复制
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)<---
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 01:35:47

所以我已经解决了这个问题。显然,当EasyNetQ实例化处理程序时,它不会使用指定的DI框架来实现它(Boo!)。您必须分别指定"MessageDispatcher“实现。太棒了!哦..。但是..。只有一个实现的Autofac,而不是尼尼莫(Boo!x2)。

所以,在这里,我的拉请求是为了代码来实现尼尼姆的事件分派器,这里是:https://github.com/mikehadlow/EasyNetQ/pull/309

现在,您可以将该类复制并粘贴到项目中。然后,在NinjectModule中或在设置绑定的任何地方,您可以执行以下操作:

代码语言:javascript
复制
//Bind Message Dispatcher to Ninject event message dispatcher
NinjectMessageDispatcher messageDispatcher = new NinjectMessageDispatcher(Kernel);
Bind<IAutoSubscriberMessageDispatcher>().ToConstant(messageDispatcher);

然后,无论您在哪里设置订阅服务器,您都可以执行如下操作(注意,这是用于使用IConsume接口的EasyNetQ自动订阅的)。

代码语言:javascript
复制
var subscriber = new AutoSubscriber(_serviceBus, "ProfileServices");
subscriber.AutoSubscriberMessageDispatcher = _dispatcher;
subscriber.Subscribe(Assembly.GetExecutingAssembly());

重要的部分是手动将MessageDispatcher设置为ninject的一个实例。你想如何实现这一目标取决于你自己。

我认为在将来,EasyNetQ可能需要自动完成这个任务。显然,如果您将工厂设置为使用Ninject,则很可能您的处理程序也希望使用Ninject。

噢!您可以修改上面的代码以使用您选择的DI。对于与EasyNetQ一起使用的任何DI (我认为)都需要这样做,而不仅仅是Ninject。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26744781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档