Виндзор + NHibernate + ISession + MVC - PullRequest
4 голосов
/ 20 апреля 2010

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

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

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/

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

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

Ответы [ 2 ]

9 голосов
/ 20 апреля 2010
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()));
2 голосов
/ 20 апреля 2010

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

...