ASP.NET MVC - Использование UnitOfWork - PullRequest
2 голосов
/ 08 февраля 2011

В настоящее время я работаю над веб-приложением, состоящим из 6 слоев:

  • Web (ссылка на ViewModels и контроллеры)
  • ViewModels
  • Контроллеры
  • Услуги (ссылка на данные и объекты)
  • Данные (ссылка на сущности)
  • Сущность

Я пытаюсь реализовать шаблон «UnitOfWork», и поэтому у меня есть класс, внедряемый DI для этой работы, который позволяет выполнять .commit () в результате действия в контроллере, когда я ' м сделано с базой данных.

Теперь мой вопрос ... Где должен быть размещен этот класс UnitOfWork? В данный момент это происходит в моем уровне данных, но для этого требуется, чтобы уровень контроллера ссылался на уровень данных и уровень обслуживания, что, на мой взгляд, странно ... Должен ли я переместить класс / интерфейс UnitOfWork на уровень обслуживания и использовать DI? 1019 *

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Если вы не используете шаблон Repository в своем слое Data , вы теряете время.

Цель UoW - обрабатывать изменения в нескольких экземплярах репозитория, это делается следующими способами:

  1. Единица работы выводится из фактического базового контекста (DataContext - L2SQL, ObjectContext / EF)
  2. Хранилища берут Единицу Работы в своем корте.

Единица работы делает две вещи:

  1. Есть Commit() метод
  2. Предоставление базового объекта / сущности, установленного для репозитория.

Немного сложно все настроить, но как только вы это сделаете, процесс должен выглядеть следующим образом:

  1. Контроллер получает услугу и единицу работы (оба через интерфейсы)
  2. Контроллер вызывает метод для службы ("CustomerServices.AddOrder ()")
  3. Метод вызова службы в репозитории
  4. Репозиторий вызывает метод «Добавить» для набора объектов / сущностей «Заказ»
  5. Контроллер фиксирует единицу работы

По сути, каждый слой получает экземпляр «следующего слоя» в своем конструкторе. Все должно быть DI 'и управляемым интерфейсом. UoW не полагается ни на что - но репозиторий полагается на него для сохранения во «внутренней памяти» (ORM), тогда UoW «Commit» выталкивает изменения в базу данных (в основном, обертывает метод «SaveChanges»).

Поскольку Единица работы относится к инфраструктуре / постоянству / базе данных / транзакциям, она должна перейти на уровень данных. На него должны ссылаться только контроллеры.

НТН.

0 голосов
/ 08 февраля 2011

IUnitOfWork должен быть интерфейсом для уровня данных.Когда запрос поступает в контроллер, вызывайте сервисные методы, если вам требуется CRUD, следует вызвать UnitOfWork.Вы можете использовать Session Per Request по вызову UnitOfWork в Global.asax Request_Start и фиксировать работы в Request_End.

0 голосов
/ 08 февраля 2011

Я реализовал свой класс IUnitOfWork для передачи непосредственно в мои контроллеры MVC (введено через Castle Windsor).Затем мой контроллер передает его любым объектам службы, которые он создает.

...