У меня есть настройка NServiceBus (3.2.2) с Castle Windsor в качестве его построителя, и я также использую NHibernate. Моя проблема заключается в том, что в моих обработчиках, если у меня есть несколько репозиториев, которым нужен сеанс NHibernate, они заканчиваются разными сеансами!
В документе NServiceBus указано, что любые экземпляры transient внутри контейнера будут рассматриваться как экземпляры singleton. Также мой сеанс 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?
InstancePerUnitOfWork
, означающее, что экземпляр будет одноэлементным на протяжении всей единицы работы. На практике это означает обработку одного транспортного сообщения, и это значение сопоставляется с перечислениемLifestyleType.Scoped
Windsor Castle... так что я попробую это - person Francois Joly   schedule 07.06.2012