Действительно, мой вопрос в заголовке... Как следует обрабатывать сеанс NHibernate в Нэнси для сеанса на запрос? Если у вас есть хороший ответ на этот вопрос сам по себе, дерзайте... если вам нужно больше информации, вот она:
Я привык использовать actionFilter в ASP.NET MVC для открытия и закрытия сеанса в контексте NHibernate в начале и конце веб-запроса. Таким образом, каждая операция базы данных в контексте запроса использует один и тот же сеанс.
Я думал, что в моем новом проекте, использующем Нэнси, настроено то же самое, но каждый раз, когда требуется сеанс, создается новый. Вот как я обрабатываю открытие и закрытие сеанса в моем загрузчике (наследующем от StructureMapBootstrapper):
protected override void RequestStartup(IContainer container, IPipelines pipelines, NancyContext context)
{
var sessionContainer = container.GetInstance<ISessionContainer>();
pipelines.BeforeRequest.AddItemToStartOfPipeline(x =>
{
sessionContainer.OpenSession();
return x.Response;
});
pipelines.AfterRequest.AddItemToEndOfPipeline(x => sessionContainer.CloseSession());
}
Мой ISessionContainer
основан на чем-то похожем на этот сайт. Моя реализация ISessionContainer
использует контекст сеанса NHibernate для получения «текущего сеанса».
Прямо сейчас, когда я пробую это в своем проекте Нэнси, каждый раз, когда запрашивается свойство ISessionContainer.Session
, возвращается новый сеанс. Я подумал, что это связано с тем, что сеансы на основе файлов cookie по умолчанию не включены в Nancy, поэтому я добавил это в свой загрузчик:
protected override void ApplicationStartup(IContainer container, IPipelines pipelines)
{
CookieBasedSessions.Enable(pipelines);
}
Нет игральных костей. Мне по-прежнему дают новую сессию каждый раз, когда я ее прошу.
Но, на самом деле, я не хочу диагностировать свою проблему. Я бы предпочел услышать, каков стандартный способ управления сеансом NHibernate в Нэнси.