Сервисный слой / Шаблон репозитория

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

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

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

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

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

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

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

3 ответа

Решение

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

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

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

Сэм,

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

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

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

Iain

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

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

Другие вопросы по тегам