RabbitMQ与.NET中的Unity IOC容器

Nei*_*sey 9 .net unity-container rabbitmq

我使用Unity App Block作为我的WOC项目服务层的IOC容器.使用Unity.WCF库将其插入每个WCF服务时,这非常有效.

我最近将RabbitMQ引入了我的服务层,我目前正在使用"使用"块来连接并添加到队列中.我不喜欢这个,我想用它HierachicalLifetimeManager来创建和销毁我与RabbitMQ的连接,因为我需要它们?这听起来不错吗?

我正在寻找一个这样的样本,或者至少是关于最佳方法的一些指导?(例如,我是否应该封装连接并根据需要注入每个服务?我将如何封装RabbitMQ使用者等?)

Luk*_*oid 6

我建议将其注册IConnection为单身人士。

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

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

unityContainer.RegisterType<IConnection, AutorecoveringConnection>(new ContainerControlledLifetimeManager(),
    new InjectionMethod("init"));
Run Code Online (Sandbox Code Playgroud)

AutorecoveringConnection直到所属例如,一旦解决了,第一次将活路UnityContainer配置。

因为我们已经注册了ConnectionFactorywith Unity,这会自动注入到 的构造函数中AutorecoveringConnection。在InjectionMethod确保了第一次AutorecoveringConnection得到解决,该init方法将被调用。

至于你是否应该从你的服务中抽象出 RabbitMQ,我的回答是肯定的,但我不会简单地创建一个IMessageQueue抽象。想想你使用消息队列的目的是什么,是为了推送状态?如果是这样,请IStatusNotifier为 RabbitMQ 提供一个具有具体实现的接口。如果要获取更新,请使用具有IUpdateSourceRabbitMQ 的具体实现的接口。你可以看到我要去哪里。

如果您为 Message Queue 创建抽象,您将自己限制为仅在所有 Message Queue 实现中可用的功能。通过IStatusNotifier为不同的 Message Queue 实现使用不同的实现,您可以利用不同技术独有的功能,同时在将来使用完全不同的技术时保持灵活性(例如写入 SQL 数据库或输出到安慰)。