Сервисный слой / Шаблон репозитория
Я создаю приложение 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, у вас будет другой промежуточный уровень обслуживания.