2010-04-19 2 views
4

Я пытаюсь получить Виндзор, чтобы дать мне экземпляр ISession для каждого запроса, который должен быть впрыскивается во всех репозиторияхВиндзор + NHibernate + ISession + MVC

Вот моя установка контейнера

container.AddFacility<FactorySupportFacility>().Register(
    Component.For<ISessionFactory>().Instance(NHibernateHelper.GetSessionFactory()).LifeStyle.Singleton, 
    Component.For<ISession>().LifeStyle.Transient 
     .UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession()) 
    ); 

//add to the container 
container.Register(
    Component.For<IActionInvoker>().ImplementedBy<WindsorActionInvoker>(), 
    Component.For(typeof(IRepository<>)).ImplementedBy(typeof(NHibernateRepository<>)) 
    ); 

Его основано на сообщении StructureMap здесь http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

Однако при его запуске создается новый сеанс для каждого объекта, который он также вводит. что мне не хватает?

(FYI NHibernateHelper, устанавливает конфигурации для Nhib)

ответ

2

ISession должен иметь LifeStyle.PerWebRequest. Но вы можете просто использовать NHibernate facility вместо того, чтобы вручную обрабатывать эти вещи.

+0

Спасибо, я рассмотрю PerWebRequest. Я не слишком заинтересован в Facility, так как мне не нужна зависимость SessionManager. – dbones

+0

Вы можете просто игнорировать ISessionManager и вводить ISessionFactory. Или даже создать дополнительную заводскую регистрацию и ввести ISession. –

9
container.AddFacility<FactorySupportFacility>(); 
container.Register(Component.For<ISessionFactory>() 
          .LifeStyle.Singleton 
          .UsingFactoryMethod(() => new NhibernateConfigurator().CreateSessionFactory())); 

container.Register(Component.For<ISession>() 
          .LifeStyle.PerWebRequest 
          .UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession())); 
+0

+1 для кода – dbones

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