Область действия nHibernate в ASP.NET MVC - запрос или действие? - PullRequest
1 голос
/ 15 сентября 2011

Если сеансовые транзакции в ASP.NET MVC выполняются для каждого запроса или для каждого действия, и если они должны быть для каждого действия (что, я думаю, должно), как вы определяете сессию для каждого действия, когда они контролируются через IoC ( Я использую StructureMap в качестве моего решения зависимости)? Я думаю, что большинство реализаций жизненного цикла области в контейнерах IoC выполняется для каждого HttpContext и / или для каждого потока при их наиболее детальной настройке, но запросы mvc могут иметь несколько действий через дочерние действия. Я думал о том, чтобы запросить фабрику сессий в моем атрибуте действия, управляющего моими транзакциями, и создать с ним сессию, но как тогда убедиться, что хранилища данных используют тот же сеанс, что и действие, к которому они обращаются?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Я думаю, что самым простым способом является использование фабричного метода и объема запроса. Затем сеанс создается, когда это действительно необходимо, и сохраняется до конца запроса.

Использование только одного сеанса для каждого запроса облегчает работу, например, при использовании свойств отложенной загрузки.

Я не знаю о StructureMap, но с Castle Windsor мне нужна только одна строка

container.Register<ISession>(c => c.Resolve<ISessionFactory>().OpenSession(), LifeStyle.PerRequest);

и сессии работают как шарм.

0 голосов
/ 29 ноября 2012

В итоге я использовал атрибут, добавленный в MVC на глобальном уровне, который дал бы мне новый сеанс для контекста действия. Я получил информацию от http://ayende.com/blog/4809/refactoring-toward-frictionless-odorless-code-what-about-transactions и http://slynetblog.blogspot.com/2011/04/lightweight-nhibernate-and-aspnet-mvc.html.

...