我使用 Unity App Block 作为 WCF 项目服务层的 IOC 容器。使用 Unity.WCF 库将其插入到每个 WCF 服务中,效果非常好。
我最近将 RabbitMQ 引入了我的服务层,目前我正在使用“using”块来连接并添加到队列中。我不喜欢这个,但我希望使用HierachicalLifetimeManager
在需要时创建和销毁与 RabbitMQ 的连接?这听起来正确吗?
我正在寻找这样的示例,或者至少寻找一些有关最佳方法的指导? (例如,我应该封装连接并根据需要注入到每个服务中吗?我将如何封装 RabbitMQ 消费者等?)
我建议注册IConnection
作为单身人士。
要注册IConnection
作为 Unity 中的单例,您将使用ContainerControlledLifetimeManager
, e.g.
var connectionFactory = new ConnectionFactory
{
// Configure the connection factory
};
unityContainer.RegisterInstance(connectionFactory);
unityContainer.RegisterType<IConnection, AutorecoveringConnection>(new ContainerControlledLifetimeManager(),
new InjectionMethod("init"));
The AutorecoveringConnection
例如,一旦第一次解决就会一直存活,直到拥有UnityContainer
被处置。
因为我们已经注册了ConnectionFactory
with Unity
,这将自动注入到构造函数中AutorecoveringConnection
.
The InjectionMethod
确保第一次AutorecoveringConnection
解决了,则init
方法被调用。
至于你是否应该从服务中抽象出 RabbitMQ 的问题,我的答案是肯定的,但是我不会简单地创建一个IMessageQueue
抽象。想想你使用消息队列的目的是什么,是为了推送状态吗?如果是这样,请有一个IStatusNotifier
与 RabbitMQ 的具体实现的接口。如果要获取更新,请有一个IUpdateSource
与 RabbitMQ 的具体实现的接口。你可以明白我要说的是什么。
如果您为消息队列创建抽象,则您将自己限制为仅在所有消息队列实现中可用的功能。通过不同的实现IStatusNotifier
对于不同的消息队列实现,您可以利用不同技术特有的功能,同时在将来使用完全不同的技术时保持灵活性(例如写入 SQL 数据库或输出到控制台)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)