gpt4 book ai didi

.net - .NET 中带有 Unity IOC 容器的 RabbitMQ

转载 作者:行者123 更新时间:2023-12-02 03:46:36 34 4
gpt4 key购买 nike

我使用 Unity App Block 作为 WCF 项目服务层的 IOC 容器。使用 Unity.WCF 库将其插入到每个 WCF 服务中,效果非常好。

我最近将 RabbitMQ 引入了我的服务层,目前我正在使用“using” block 来连接并添加到队列中。但我不喜欢这样,并且希望在需要时使用 HierachicalLifetimeManager 创建和销毁与 RabbitMQ 的连接?这听起来正确吗?

我正在寻找一个示例,或者至少寻找一些有关最佳方法的指导? (例如,我应该封装连接并根据需要注入(inject)到每个服务中吗?我将如何封装 RabbitMQ 消费者等?)

最佳答案

我建议将 IConnection 注册为单例。

要将IConnection注册为Unity中的单例,您可以使用ContainerControlledLifetimeManager,例如

var connectionFactory = new ConnectionFactory
{
// Configure the connection factory
};
unityContainer.RegisterInstance(connectionFactory);

unityContainer.RegisterType<IConnection, AutorecoveringConnection>(new ContainerControlledLifetimeManager(),
new InjectionMethod("init"));

AutorecoveringConnection 实例一旦第一次解析,将保持事件状态,直到拥有的 UnityContainer 被释放。

因为我们已经向 Unity 注册了 ConnectionFactory,所以它会自动注入(inject)到 AutorecoveringConnection 的构造函数中。InjectionMethod 确保第一次解析 AutorecoveringConnection 时,调用 init 方法。

至于您是否应该从服务中抽象出 RabbitMQ 的问题,我的答案是肯定的,但是我不会简单地创建一个 IMessageQueue 抽象。想想你使用消息队列的目的是什么,是为了推送状态吗?如果是这样,请拥有一个带有 RabbitMQ 具体实现的 IStatusNotifier 接口(interface)。如果要获取更新,请使用带有 RabbitMQ 具体实现的 IUpdateSource 接口(interface)。你可以看到我要讲的内容。

如果您为消息队列创建抽象,则您将自己限制为仅在所有消息队列实现中可用的功能。通过针对不同的消息队列实现使用不同的 IStatusNotifier 实现,您可以利用不同技术特有的功能,同时在将来使用完全不同的技术时保持灵 active (例如,编写到 SQL 数据库或输出到控制台)。

关于.net - .NET 中带有 Unity IOC 容器的 RabbitMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29985065/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com