tme*_*ser 4 .net c# dependency-injection rabbitmq
我正在尝试为我正在编写的一对Windows服务设置RabbitMQ,以便以快速可靠的方式促进它们之间的通信.但是,我在尝试设置主要的Windows服务引擎时遇到了问题,这些引擎需要建立与RabbitMQ服务器的连接来完成它们的工作.
基本上,ConnectionFactory
RabbitMQ的.NET客户端中的对象不是抽象的,并且不实现任何接口.我看不到使用像StructureMap这样的IoC容器注入这个类的明显方法.甚至文档中的代码示例也只是公然显示new
它,如下所示:
ConnectionFactory factory = new ConnectionFactory();
factory.Uri = "amqp://user:pass@hostName:port/vhost";
IConnection conn = factory.CreateConnection();
Run Code Online (Sandbox Code Playgroud)
向我展示的解决方案是将整个工厂推向服务的主要部分OnStart
和OnStop
功能,这些都非常难以测试,而且无论如何都没有太大的兴趣.但是,这使我只有一个IConnection
服务,所以如果该连接以任何方式被破坏,服务无法恢复,必须简单地退出.如果主引擎可以看到工厂,它可以简单地产生一个新连接并继续.但除非我注入,否则没有连接到现有服务器就无法测试主引擎!
这里有什么我想念的吗?还有其他我不考虑的选择吗?如何注射这个工厂,如果我不能,我怎样才能限制损坏?
编辑:另外,作为一个事后的想法,我非常高兴能够改变RabbitMQ的.NET客户端来实现这个界面,如果有人知道主开发团队对这样的变化有多接受.我很乐意做出贡献,但我想做的最后一件事是让我的程序处理一些自定义版本的RabbitMQ,从而消除了首先使用第三方库的主要好处.
RabbitMQ C#客户端是一个低级纯粹的AMQP实现,您可能希望将其包装在更高级别的抽象中,然后将其注册到您的IoC容器中.
EasyNetQ是基本客户端的更高级抽象,它实现了一个持久的AMQP连接,该连接在连接丢失后(通过网络问题或服务器跳出)重新连接,并重建所有当前订阅.欢迎您使用任何有用的代码.
简而言之,这是一个在某种PersistentConnection类中包装连接管理,然后使用一些代码注册每个订阅以在重新连接成功后重建它们的问题.
我写了一篇关于连接EasyNetQ,Windsor IoC容器和TopShelf 的博客文章.我已经成功地使用这种技术来构建基于RabbitMQ的Windows服务.
棘手的部分是它看起来像根据文档 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
};
}
}
Run Code Online (Sandbox Code Playgroud)
对于你最终使用它的类,
public class RabbitMQUserClass
{
public ConnectionFactory ConnectionFactory {get; private set;}
public RabbitMQUserClass(IConnectionFactory connectionFactory)
{
ConnectionFactory = connectionFactory.Get();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5589 次 |
最近记录: |