RabbitMQ с контейнером Unity IOC in.NET
Я использую блок Unity App в качестве контейнера IOC для моего уровня обслуживания проекта WCF. Это работает довольно хорошо, используя Unity.Библиотека WCF для подключения к каждой службе WCF.
недавно я ввел RabbitMQ в свой уровень обслуживания, и в настоящее время я использую блоки "using" для подключения и добавления в очередь. Мне это не нравится, и я хочу использовать HierachicalLifetimeManager
чтобы создать и уничтожить мою связь с RabbitMQ, как мне нужно? Это звучит правильно?
Я ищу образец этого или, по крайней мере, некоторые рекомендации по лучшему подходу? (например, должен ли я инкапсулировать соединение и вводить в каждую службу по мере необходимости? Как бы я инкапсулировал потребителя RabbitMQ и т. д.?)
2 ответов
я бы посоветовал зарегистрировать 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
удален.
потому что мы зарегистрировали ConnectionFactory
С Unity
, это будет автоматически введено в конструктор AutorecoveringConnection
.
The InjectionMethod
гарантирует, что в первый раз AutorecoveringConnection
разрешения init
метод вызывается.
Что касается вашего вопроса о том, следует ли абстрагироваться от RabbitMQ от ваших услуг, мой ответ будет да, однако я бы не просто создать IMessageQueue
абстракция. Подумайте о том, для чего вы используете очередь сообщений, чтобы нажимать статусы? Если это так, имейте IStatusNotifier
интерфейс с конкретной реализацией для RabbitMQ. Если это для получения обновлений, имейте IUpdateSource
интерфейс с конкретной реализацией Для в RabbitMQ. Вы видите, к чему я клоню.
если вы создаете абстракцию для очереди сообщений, вы ограничиваете себя функциями, доступными только во всех реализациях очереди сообщений. Имея другую реализацию IStatusNotifier
для различных реализаций очереди сообщений вы можете воспользоваться функциями, которые уникальны для разных технологий, а также оставаться гибкими, если в будущем будут использоваться совершенно разные технологии (например, запись в базу данных SQL или вывод в консоль).
С RabbitMQ вы хотите, чтобы ваш IConnection использовался все время, вы не хотите его в блоке "using". Вот моя привязка IOC с помощью Ninject, обратите внимание на InSingletonScope, это то, что вы хотите.
Bind<IConnection>()
.ToMethod(ctx =>
{
var factory = new ConnectionFactory
{
Uri = ConfigurationManager.ConnectionStrings["RabbitMQ"].ConnectionString,
RequestedHeartbeat = 15
//every N seconds the server will send a heartbeat. If the connection does not receive a heardbeat within
//N*2 then the connection is considered dead.
//suggested from http://public.hudl.com/bits/archives/2013/11/11/c-rabbitmq-happy-servers/
};
var con = new AutorecoveringConnection(factory);
con.init();
return con;
})
.InSingletonScope();