Сервисный слой / Шаблон репозитория - PullRequest
3 голосов
/ 02 марта 2011

Я создаю приложение MVC с использованием шаблона Service Layer / Repository / Unit of Work с EF4.

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

Поэтому контроллеры MVC вызывают службы для заполнения моделей просмотра.Так можно ли сказать, что приложение MVC связано с сервисным уровнем?

Затем сервисный уровень вызывает хранилище для получения и сохранения объектов.Можно ли сказать, что уровень обслуживания зависит от репозитория?

Репозиторий использует EF4 для получения и сохранения данных на SQL-сервере, поэтому я предполагаю, что репозиторий зависит от EF4, который, в свою очередь, зависит от SQL Server..

Куда вписывается единица работы.

Какие-нибудь примеры, пожалуйста?Спасибо !!

Ответы [ 3 ]

4 голосов
/ 02 марта 2011

Я начал с сокрытия единицы работы где-то на нижнем уровне, но это неправильный способ сделать это. После некоторого опыта мое мнение таково:

  • В случае монолитного приложения UnitOfWork должен быть доступен для контроллера и нижних уровней.
  • В случае распределенного приложения (пользовательский интерфейс и BL находятся на разных серверах), UnitOfWork должен быть доступен для фасада бизнес-уровня (сервисный уровень для удаленных вызовов) и нижних уровней.

Причина в том, что упомянутые слои определяют, что такое "бизнес-операция" = какая является текущей единицей работы. Только этот уровень знает, когда он хочет зафиксировать изменения в хранилище данных. Это позволяет составлять сервисы (повторное использование кода). Я обсуждал подобный вопрос здесь и здесь .

3 голосов
/ 02 марта 2011

Sam

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

Главное, что нужно сделать, это создать абстракцию Единицы Работы в Nhibernate, это будет Session, в EF это будет ваш контекст и передача этого сеанса или контекста в ваши репозитории, как часть вашего теста, вы можете подделать соединения использовать список диктатов.

Надеюсь, что это поможет.

Иэн

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

Вы правы в своих предположениях о расслоении. Ваш EF-контекст - это единица работы. Обычно вы абстрагируете это через интерфейс, а затем конструктор вводите в каждый репозиторий для операций CRUD. Другой подход - выставить свои репозитории на интерфейсе UoW (я предпочитаю первый). Любой способ позволяет упростить юнит-тестирование каждого слоя. Один вызов Save в UnitOfWork из уровня сервиса затем сохранит все изменения во всех репозиториях.

Вот хорошая статья о MSDN , которая рассматривает UoW с точки зрения модульного тестирования, но также охватывает репозитории. Там, где он ссылается на репозитории из контроллера MVC, у вас будет другой промежуточный уровень обслуживания.

...