.NET 中带有 Unity IOC 容器的 RabbitMQ

2024-02-10

我使用 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(使用前将#替换为@)

.NET 中带有 Unity IOC 容器的 RabbitMQ 的相关文章

随机推荐