2015-09-07 2 views
3

Мы размещаем некоторые службы WCF, и мы используем замок Виндзор, как МОК и использовать WCF фонд для размещения службы:Ребус обработки в контексте WCF с NHibernate и замок WCF Facility сообщение

Component.For<IInter1>() 
    .ImplementedBy<Class1>() 
    .LifestylePerWcfOperation() 
    .AsWcfService() 

Все другие зависимости регистрируются с LifestylePerWcfOperation в Виндзоре.

Ребус обработчиков, как это:

public class TestCastleRebusHandler : IHandleMessages<CastleRebusMessage> 
{ 
    public TestCastleRebusHandler(DependenchyWithWCFContext failsHere) { } 
    public void Handle(CastleRebusMessage message) { } 
} 

Проблем все регистрации PerWcfOperation, и они не могут быть введены в Ребус, так как контекст не WCF, при получении сообщения. Конфигурация Rebus:

_adapter = new Rebus.Castle.Windsor.WindsorContainerAdapter(Container); 
_bus = Configure.With(_adapter) 
    .Logging(x => x.ColoredConsole(LogLevel.Info)) 
    .Transport(x => x.UseMsmqAndGetInputQueueNameFromAppConfig()) 
    .MessageOwnership(m => m.FromRebusConfigurationSection()) 
    .Subscriptions(x => x.StoreInMemory()) 
    .CreateBus() 
    .Start(); 

Каков наилучший подход для обработки этого сценария?

Кен

ответ

2

Лучший подход должны иметь WindsorContainer экземпляр за «логическим приложение» в вашем процессе, где ваши логические приложения будут один WCF приложений и один Ребус приложение.

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

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

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

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

Если у вас есть приложение IBus в вашем приложении WCF, вы можете просто сконфигурировать one-way client (*) для контейнера WCF.

Я надеюсь, что имеет смысл :)


(*) Пожалуйста, обратите внимание, что документы были обновлены с учетом API-интерфейсы из Ребус 2 (версии 0.90.0 и выше), но они очень похожи для старых Rebus

+0

Спасибо. Это имеет смысл. Поэтому, если я хочу сделать шаблон «сеанс за сообщение», где ISession доступен через всю жизнь обработки сообщений и автоматически фиксируется на завершающем этапе, нужно ли ему использовать PreMessage и AfterMessage для управления сеансом? И безопасно ли хранить сессию в течение жизни в CallContext или лучше другой контекст? – Ken

+0

на самом деле есть расширение LifestylePerRebusMessage() 'Windsor на пути - оно будет доступно через 0,98.6 сегодня вечером – mookid8000

+0

, и вы должны использовать' MessageContext.Current.TransactionContext.Элементы ", если вы хотите безопасно хранить вещи при обращении с сообщением Rebus - он будет автоматически передаваться в нужные потоки в продолжении при использовании' async'/'await' – mookid8000