2014-02-11 3 views
1

У меня ситуация с издателем и потребителем, сидящим в одном приложении. Я использую autofac.MassTransit, Autofac и 2 экземпляра шины

Как я понимаю, мне нужны два экземпляра шины с двумя конечными точками, один для издателя, один для подписчика.

Я использую autofac, но я не знаю, как создать 2 экземпляра шины, каждый из которых имеет свои собственные классы подписки (которые должны быть разрешены autofac). В JEE/CDI я бы использовал квалификаторы, но, насколько я вижу, autofac не имеет ничего подобного (и названные службы не автоуведомлены).

Поэтому в основном у меня есть 2 проблемы:

  • регистр 2 экземпляра шины с каждый из которых имеет определенный набор абонентов.
  • найти подходящий экземпляр позже.

Любые подсказки, как это можно сделать?

ответ

3

Она использует именованные экземпляры ...

builder.Register(c => new FooImpl()) 
    .As<IFoo>() 
    .Named("Foo1"); 

Тогда

container.ResolveNamed<IFoo>("Foo1"); 

Если мой синтаксис Autofac правильно с верхней части моей головы. Это должно по крайней мере привести вас к правильному пути. Просто запросите экземпляр каждого IServiceBus, чтобы они были разрешены и созданы из вашего контейнера.

О, и вы не можете использовать LoadFrom, чтобы зарегистрировать потребителей. Вам придется решать и регистрировать каждый из них вручную. Поскольку звонок LoadFrom зарегистрирует всех потребителей в вашем контейнере.

Вы можете создать два подконтейнера, по одному для каждого IServiceBus, но теперь мы находимся далеко за пределами области того, что я знаю, как сделать это с моей головы с помощью Autofac. Вы можете сделать это практически с любым другим контейнером, поэтому я предполагаю, что вы можете с Autofac.

2

Если вы посмотрите проект RapidTransit, у него есть библиотеки для выхода с земли с помощью служб построения с использованием MassTransit и Autofac. Вы также можете установить пакеты из NuGet для служб Windows или веб-приложений.

https://github.com/MassTransit/RapidTransit

Вы также можете посмотреть на Riktig, который использует RapidTransit.

https://github.com/phatboyg/riktig/

Вы можете увидеть, как несколько шины экземпляры создаются в том же процессе, с помощью вложенных прижизненные областей в Autofac.

https://github.com/phatboyg/Riktig/blob/master/src/Riktig.CoordinationService/ImageRetrievalStateBusInstance.cs

И как это все связаны друг с другом с помощью Bootstrappers:

https://github.com/phatboyg/Riktig/blob/master/src/Riktig.CoordinationService/CoordinationServiceBootstrapper.cs

Ключ является использование:

 builder.RegisterType<ImageRetrievalStateBusInstance>() 
       .As<IServiceBusInstance>(); 

Это один экземпляр, и несколько может быть зарегистрированный в узле экземпляра, чтобы предоставить вам несколько сервисов.

+0

FYI, RapidTransit теперь публикуется как NuGet, а основной проект Riktig также обновлен. –

Смежные вопросы