2012-06-06 3 views
0

У меня есть NServiceBus (3.2.2) настройка с Castle Windsor как его создатель, и я также использую NHibernate. Проблема у меня в том, что в моих обработчиках, если у меня есть несколько репозиториев, которым нужен сеанс NHibernate, они заканчивают разными сеансами!NServiceBus 3.2 и дочерние контейнеры

NServiceBus документ гласит, что любые переходных экземпляров внутри контейнера будут рассматриваться как одноточечные экземпляров. Также мой сеанс NHibernate завернут в блок абстракции работы.

Вот код, используемый для установки NServiceBus с NHibernate:

IWindsorContainer container = new WindsorContainer(new XmlInterpreter()); 
container.Install(new ContainerInstaller()); 
container.Install(new UnitOfWorkInstaller(AppDomain.CurrentDomain.BaseDirectory, LifestyleType.Transient)); 
container.Install(new FactoryInstaller(AppDomain.CurrentDomain.BaseDirectory, LifestyleType.Transient)); 
container.Install(new RepositoryInstaller(AppDomain.CurrentDomain.BaseDirectory, LifestyleType.Transient)); 

Configure.With() 
    .CastleWindsorBuilder(container) 
    .FileShareDataBus(Properties.Settings.Default.DataBusFileSharePath) 
    .MsmqTransport() 
     .IsTransactional(true) 
     .PurgeOnStartup(false) 
    .UnicastBus() 
     .LoadMessageHandlers() 
     .ImpersonateSender(false) 
    .JsonSerializer(); 

UnitOfWorkInstaller это как коснуться:

var fromAssemblyDescriptor = AllTypes.FromAssemblyInDirectory(new AssemblyFilter(_installationPath)); 
container.Register(fromAssemblyDescriptor 
    .IncludeNonPublicTypes() 
    .Pick() 
    .If(t => t.GetInterfaces().Any(i => i == typeof(IUnitOfWork)) && t.Namespace.StartsWith("Magma")) 
    .WithService.AllInterfaces() 
    .Configure(con => con.LifeStyle.Is(_lifeStyleType).UsingFactoryMethod(k => k.Resolve<IUnitOfWorkFactory>().Create()))); 

Так что, когда NHibernate сессия необходимости, она будет создаваться с UnitOfWorkFactory. Я попытался поместить свойство current_session_context_class в «thread_static» в конфигурации NHibernate, но это не сработало.

Почему у меня есть разные единицы работы в моих обработчиках NServiceBus?

+0

Я не верю в это: документ NServiceBus гласит, что любые временные экземпляры в контейнере будут рассматриваться как экземпляры одноранговой сети. – mynkow

+0

@mynkow «NServiceBus создает дочерний контейнер для каждого принятого транспортного сообщения, помните, что транспортные сообщения могут содержать несколько« пользовательских сообщений ». Это означает, что все временные экземпляры, созданные во время обработки этого сообщения, находятся в зоне действия в виде одиночных элементов внутри дочерний контейнер. Это позволяет вам легко обмениваться, например, сеансом NHibernate между репозиториями, не обманывая статическим кэшированием потоков ». вы можете найти соответствующую документацию [здесь] (http://nservicebus.com/SupportForChildContainers.aspx) –

+0

похоже, что она изменилась, поскольку, глядя на исходный код, вы можете увидеть новое перечисление жизненного цикла NServiceBus 'InstancePerUnitOfWork', что означает, что« The экземпляр будет одноточечным на весь период работы. На практике это означает обработку одного транспортного сообщения « , и это значение отображается в переписке« LifestyleType.Scoped »Windsor Castle ... поэтому я попробую это –

ответ

1

У меня есть работа с использованием стиля Castle LifestyleType.Scoped. Но тогда, по очевидным причинам, мой обработчик был вызван снова и снова, пока сообщение не было отправлено в очередь ошибок. Раньше у меня была эта проблема, и это было связано с откатом или совершением транзакции внутри обработчика. В моей работе я возвращал любые незафиксированные изменения в методе Dispose. Единственное, что мне нужно было сделать, это разобрать сеанс и удалить звонок Rollback.

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

  • Нет связанных вопросов^_^