c# - RabbitMQ:注入(inject)连接工厂

标签 c# .net dependency-injection rabbitmq

我正在尝试为我正在编写的一对 Windows 服务设置 RabbitMQ,以便以快速可靠的方式促进它们之间的通信。但是,我在尝试设置主要的 Windows 服务引擎时遇到了问题,这些引擎需要建立到 RabbitMQ 服务器的连接才能完成它们的工作。

基本上,RabbitMQ 的 .NET 客户端中的 ConnectionFactory 对象不是抽象的,也没有实现任何接口(interface)。我看不到使用像 StructureMap 这样的 IoC 容器注入(inject)此类的明显方法。甚至文档中的代码示例也只是公然地新建,如下所示:

 ConnectionFactory factory = new ConnectionFactory();
 factory.Uri = "amqp://user:pass@hostName:port/vhost";
 IConnection conn = factory.CreateConnection();

出现在我面前的解决方案是将整个工厂插入服务的主要 OnStartOnStop 功能,这真的很难测试而且不是很大无论如何兴趣。但是,这给我留下了一个用于该服务的 IConnection,因此如果该连接以任何方式中断,该服务将无法恢复,必须简单地退出。如果主机对工厂有可见性,它可以简单地产生一个新的连接并继续。但是除非我注入(inject)它,否则在不连接到现有服务器的情况下无法测试主引擎!

我在这里遗漏了什么吗?我没有考虑的任何其他选择?我该如何着手注入(inject)这个工厂,如果不能,我该如何限制损失?

编辑:另外,作为事后的想法,我非常乐意对 RabbitMQ 的 .NET 客户端进行更改以在其上实现一个接口(interface),如果有人很好地了解主要开发团队对这样的更改的接受程度这个。我很乐意做出贡献,但我最不想做的就是让我的程序在某些自定义版本的 RabbitMQ 上运行,从而首先消除使用第三方库的主要好处。

最佳答案

RabbitMQ C# 客户端是一个低级的纯 AMQP 实现,您可能希望将其包装在一些更高级别的抽象中,然后将其注册到您的 IoC 容器中。

EasyNetQ ,对基本客户端的更高级别的抽象,实现了一个持久的 AMQP 连接,该连接在连接丢失后重新连接(通过网络问题或服务器弹跳),并重建所有当前订阅。欢迎您使用您认为有用的任何代码。

简而言之,这是一个将连接管理包装在某种 PersistentConnection 中的问题。类,然后注册每个订阅 with some code to rebuild them after a successful reconnect .

我写了a blog post关于连接 EasyNetQ、Windsor IoC 容器和 TopShelf。我已成功使用此技术构建基于 RabbitMQ 的 Windows 服务。

关于c# - RabbitMQ:注入(inject)连接工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13181328/

相关文章:

java - 如何在 Java EE 中注入(inject)外部定义的类

c# - 通过 Controller Factory 注入(inject)实例

java - 动态选择依赖关系,无需 if else

c# - 淡入/淡出声音

c# - 使用 WCF 发送大数据而不流式传输

c# - 使用 XML 序列化时的循环引用?

c# - IDX20803 : Unable to obtain configuration from: 'https://localhost/IdentityServer/Core/.well-known/openid-configuration'

c# - 迭代泛型类型<T>

c# - 如何在C#中声明和使用数组

.net - 通过 Reflection.Emit 调用默认的无参数值类型构造函数