gpt4 book ai didi

c# - 将 Ninject 与 EasyNetQ/RabbitMQ 消息处理程序一起使用

转载 作者:太空狗 更新时间:2023-10-30 01:18:33 24 4
gpt4 key购买 nike

我正在尝试将 EasyNetQ 与 Ninject 结合使用来记录消息。

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

我告诉 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)<---

最佳答案

所以我已经解决了这个问题。显然,当 EasyNetQ 实例化一个处理程序时,它不会使用指定的 DI 框架来执行它(嘘!)。您必须单独指定一个“MessageDispatcher”实现。惊人的!哦...但是...只有 Autofac 的实现,而不是 Ninject(Boo!x2)。

因此,我的拉取请求在这里,用于实现 Ninject 事件调度程序的代码在这里: https://github.com/mikehadlow/EasyNetQ/pull/309

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

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

然后无论您在哪里设置订阅者,您都可以执行以下操作(请注意,这是使用 EasyNetQ 的 IConsume 界面进行自动订阅。

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

重要的部分是手动将 MessageDispatcher 设置为 ninject 调度程序的实例。你想如何实现这一点取决于你。

我想在未来,EasyNetQ 可能需要自动完成这项工作。显然,如果您将工厂设置为使用 Ninject,您的处理程序很可能也想使用 Ninject。

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

关于c# - 将 Ninject 与 EasyNetQ/RabbitMQ 消息处理程序一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com