Что не так с этим дизайном системы ASP.net MVC?

У меня есть фотогалерея ASP.Net MVC 3, которая разработана таким образом:

Data Repositories(IImageRepoSitory, ITagRepository etc)
      |
   Services (IGalleryService, IWebService etc)
      |
  Web Application

Который я использую Ninject для внедрения необходимых сервисов и репозиториев в веб-приложение.

Прежде чем использовать настоящую базу данных, я использовал простой ArrayList (и сериализацию JSON) в качестве своей постоянной логики (это будет JsonImageRepository/JSonTagRepository), которая прекрасно работает. Но позже я перешел на EF4 CTP5 (Code First), и появилось много проблем. По сути, я внедрил эти репозитории и службы как Singleton (объявленный в Global.asax.cs), но когда у меня есть несколько потоков, обращающихся к репозиториям, он говорит:

Соединение данных закрыто.

Я перешел на что-то вроде режима потока или режима запроса в Ninject, но возникли различные исключения (относительно нескольких экземпляров контекста, поэтому я думаю, что Singleton должен быть единственным вариантом).

Что-то не так с дизайном? или как мне настроить эти компоненты?


person xandy    schedule 07.02.2011    source источник


Ответы (1)


Обычно доступ к репозиторию должен быть в области запроса (по крайней мере, те, которые изменяют данные). Я рекомендую просмотреть сообщения в блоге Боба о реализации шаблона репозитория с использованием Ninject и NHibernate. Для EF4 должно быть почти то же самое:

http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/

http://blog.bobcravens.com/2010/07/using-nhibernate-in-asp-net-mvc/

http://blog.bobcravens.com/2010/09/the-repository-pattern-part-2/

Я планировал добавить это в пример приложения в ближайшем будущем.

person Remo Gloor    schedule 07.02.2011
comment
Это означает, что репозиторий должен создаваться каждый раз, когда делается новый запрос, и уровень службы, который зависит от IRepos, также должен находиться в области запроса, не так ли? - person xandy; 07.02.2011
comment
верно. вы также захотите открыть транзакцию, когда запрос начнется, и зафиксировать или откатить транзакцию, когда запрос завершится. - person Dave Thieben; 08.02.2011
comment
Просто еще один уточняющий вопрос. В таком случае объект Entity не может жить дольше одного цикла запроса, это означает, что если по какой-то причине мне нужно кэшировать объект Entity в сеансе, это невозможно, кроме как дублировать его, верно? - person xandy; 10.02.2011