Сеанс RavenDB на запрос с MVC3 и Ninject с использованием модели репозитория

Я ищу несколько советов о правильном механизме, который следует использовать для получения RavenDB IDocumentSession в мои репозитории в истинном поведении session-pr-request.

Это новое приложение MVC3, и я получил Ninject/Ninject.MVC3 с помощью NuGet. RavenDB работает на внешнем сервере (то есть не встроенном).

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

Однако правда ли, что MVC3 будет создавать экземпляр контроллера для каждого метода действия? В этом случае я могу просто позволить MVC3/Ninject внедрить мои репозитории и сеансы, которые им нужны, без проблем.

Однако, если контроллер повторно используется в нескольких запросах, это может не сработать, так как репозиторий, зависший от предыдущего запроса, теперь может использовать старый и отброшенный сеанс.

Я рассмотрел несколько способов сделать это - приведенный выше является основным. Я также пытался сделать что-то вроде ActionFilterAttribute, который получает новую сессию из контейнера IoC в начале каждого запроса, но в таком случае куда его поместить?

Должен ли мой репозиторий иметь используемое им свойство Session, которое фактически каждый раз получает текущий сеанс из контейнера? Это добавило бы связь между реализацией репозитория и контейнером IoC, но в остальном, я думаю, должно работать.

Каков правильный способ сделать это? Как крутые ребята делают это? Любая помощь будет высоко ценится!


person Rune Jacobsen    schedule 19.06.2011    source источник
comment
Взгляните на этот пост. Он использует Structuremap, но вы сможете преобразовать его в Ninject: dotnetguy.co.uk/post/2010/06/12/ Это должно позволить вам создать один сеанс для каждого HTTP-запроса.   -  person Mikael Östberg    schedule 20.06.2011


Ответы (3)


Если вы не делаете что-то действительно смешное со своей фабрикой контроллеров, каждый экземпляр контроллера будет использоваться для одного запроса. Контроллеры не являются потокобезопасными и обычно не выживают после одного запроса.

person Ayende Rahien    schedule 19.06.2011
comment
Спасибо - я не знаю, откуда я взял идею, что это будет повторно использоваться какое-то время, но это значительно упрощает задачу. :) - person Rune Jacobsen; 19.06.2011
comment
О, и пока я в этом - спасибо за отличный продукт! Я смотрю на RavenDB после того, как увидел несколько презентаций о нем на NDC 2011, и он определенно может сделать жизнь многих проще! - person Rune Jacobsen; 19.06.2011

Я написал подробное сообщение в блоге об использовании InRequestScope Ninject, так что IDocumentSession вводится один раз за запрос. Ninject отлично справляется с управлением областью для вас.

http://www.dalsoft.co.uk/blog/index.php/2012/04/12/mvc-get-ravendb-up-and-running-in-5-minutes-using-ninject/

person DalSoft    schedule 16.04.2012
comment
Хорошо, как вы собираетесь удалять сеанс документа, когда запрос завершен? - person Greg B; 08.03.2013
comment
Установка области InRequestScope для привязки IDocumentSession имеет дело с этим github.com/ninject/ Ninject.Web.Common/wiki/InRequestScope - person DalSoft; 10.03.2013

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

Иногда это может помочь: если состояние сеанса отключено, мы больше не должны пытаться использовать свойство сеанса в контроллере, поскольку оно будет нулевым. Отключение состояния сеанса и использование свойства сеанса приведет к ужасной ошибке «ссылка на объект не указывает на экземпляр объекта».

person doublen    schedule 19.06.2011
comment
Привет, спасибо за ваш вклад. На самом деле я говорил о сеансе в репозитории, имея в виду IDocumentSession, используемый для доступа к RavenDB, а не о свойстве Session в контроллере. Я понимаю, почему это было неясно, извините! - person Rune Jacobsen; 19.06.2011