RabbitMQ:注入连接工厂

时间:2012-11-01 16:23:51

标签: c# .net dependency-injection rabbitmq

我正在尝试为我正在编写的一对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();

向我展示的解决方案是将整个工厂推向服务的主要OnStartOnStop功能,这些功能实际上很难测试,而且无论如何都没有太大的兴趣。但是,这使我只有一个IConnection的服务,所以如果该连接以任何方式被破坏,服务无法恢复,必须简单地退出。如果主引擎可以看到工厂,它可以简单地产生一个新连接并继续。但除非我注入,否则没有连接到现有服务器就无法测试主引擎!

这里有什么我想念的吗?还有其他我不考虑的选择吗?如何注射这个工厂,如果我不能,我怎样才能限制损坏?

编辑:另外,作为一个事后的想法,我很高兴能够改变RabbitMQ的.NET客户端来实现这个界面,如果有人知道主要开发团队对变化的接受程度如何这个。我很乐意做出贡献,但我想做的最后一件事就是让我的程序处理一些自定义版本的RabbitMQ,从而消除了首先使用第三方库的主要好处。

2 个答案:

答案 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();
    }
}