NHibernate, внедрение зависимости.Закройте ISession правильно - PullRequest
2 голосов
/ 07 марта 2011

Я использую Ninject, NHibernate, ASP.NET MVC3 и шаблон репозитория.Привязка модуля в Ninject выглядит следующим образом.

Bind<ISessionFactory>().ToProvider(new SessionFactoryProvider()).InSingletonScope();
Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope();

Вопрос в том, должен ли репозиторий принимать ISession или ISessionFactory.Если требуется ISessionFactory, то в репозитории я могу открыть сеанс, когда это необходимо, и закрыть его после использования.Если требуется ISession, хранилище использует его напрямую.Но мне интересно, закрыта ли сессия должным образом.

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Таким образом, ваш сеанс настроен как отдельный запрос. Это означает, что он открывается в начале запроса и закрывается в конце контейнером. И это, наверное, хорошая идея. Если вы попытаетесь открыть (или закрыть) сессию вручную, я думаю, это вызовет исключение. Просто вставьте ISession в хранилище.

1 голос
/ 07 марта 2011

Я обычно открываю новый сеанс и транзакцию в начале запроса и фиксирую / закрываю его в конце.

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

...