我正在尝试为我正在编写的一对Windows服务设置RabbitMQ,以便以快速可靠的方式促进它们之间的通信。但是,我在尝试设置主要的Windows服务引擎时遇到了问题,这些引擎需要建立与RabbitMQ服务器的连接来完成它们的工作。
基本上,RabbitMQ的.NET客户端中的ConnectionFactory
对象不是抽象的,并且不实现接口。我看不到使用像StructureMap这样的IoC容器注入这个类的明显方法。甚至文档中的代码示例也只是公然显示new
,如下所示:
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://user:pass@hostName:port/vhost";
IConnection conn = factory.CreateConnection();
向我展示的解决方案是将整个工厂推向服务的主要OnStart
和OnStop
功能,这些功能实际上很难测试,而且无论如何都没有太大的兴趣。但是,这使我只有一个IConnection
的服务,所以如果该连接以任何方式被破坏,服务无法恢复,必须简单地退出。如果主引擎可以看到工厂,它可以简单地产生一个新连接并继续。但除非我注入,否则没有连接到现有服务器就无法测试主引擎!
这里有什么我想念的吗?还有其他我不考虑的选择吗?如何注射这个工厂,如果我不能,我怎样才能限制损坏?
编辑:另外,作为一个事后的想法,我很高兴能够改变RabbitMQ的.NET客户端来实现这个界面,如果有人知道主要开发团队对变化的接受程度如何这个。我很乐意做出贡献,但我想做的最后一件事就是让我的程序处理一些自定义版本的RabbitMQ,从而消除了首先使用第三方库的主要好处。答案 0 :(得分:6)
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服务。
答案 1 :(得分:5)
棘手的部分是看起来像documentation ConnectionFactory
没有实现任何接口。
所以你真的离开了实现自己的东西,比如,
public interface IConnectionFactory
{
ConnectionFactory Get();
ConnectionFactory Get(string uri);
}
public class ConnectionFactoryCreator : IConnectionFactory
{
public ConnectionFactory Get(
string uri = "amqp://user:pass@hostName:port/vhost")
{
return new ConnectionFactory
{
Uri = uri
};
}
}
对于您最终使用它的课程,
public class RabbitMQUserClass
{
public ConnectionFactory ConnectionFactory {get; private set;}
public RabbitMQUserClass(IConnectionFactory connectionFactory)
{
ConnectionFactory = connectionFactory.Get();
}
}