Должна ли единица работы указывать на уровень обслуживания или хранилище? - PullRequest
4 голосов
/ 26 января 2011

Просто интересно, в среде ASP.NET MVC3 со структурой сущностей. Должна ли единица работы указывать на сервисный уровень или репозиторий (а затем репозиторий указывает на сервисный уровень)?

Я видел два примера:

  • Тот, в котором единица работы и хранилище имеют экземпляр для уровня обслуживания.

Ссылка: Entity Framework 4 CTP 4 / CTP 5 Общий шаблон репозитория и тестируемый модуль

Не использует сервисный уровень, но очевидно, что в этом случае его можно использовать.

  • Во-вторых, когда единица работы имеет экземпляр для репозитория, который имеет экземпляр для уровня обслуживания.

Ссылка: http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit- шаблонов работы с сущностью-framework-4-0.aspx

Что будет лучше?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 26 января 2011

Ну, на самом деле, если вы думаете об этом, Контроллеры должны работать с единицей работы.

Как правило, в приложении ASP.NET MVC Контроллеру назначается новый модульработы, когда приходит HTTP-запрос.

Затем контроллер будет вызывать методы службы (которая вызывает методы в репозитории), извлекая и внося изменения во внутренний граф / память Entity Framework.

Когда контроллер выполнит то, что ему нужно, он выполнит «Фиксацию» на единицу работы, что приведет к любым изменениям в базовом репозитории, которые будут зафиксированы в базе данных.

Я предполагаю, что когдавы говорите о «Сервисе», у вас есть промежуточный уровень между вашим Контроллером и Репозиторием, где Контроллер общается только со Службой, затем Служба общается с Репозиторием, а затем создает резервную копию стека приложения.ваш контроллер может выглядеть следующим образом:

public class ProductsController : Controller
{
   private IUnitOfWork _unitOfWork;
   private IProductsService _service;

   public ProductsController(IUnitOfWork unitOfWork, IProductsService service)
   {
      // use dependency injection here
      _unitOfWork = unitOfWork;
      _service = service;
   }

   [HttpPost]
   public ActionResult SubmitOrder(Product p)
   {
      var existingProduct = _service.FindById(p.ProductId);
      UpdateModel(existingProduct);
      _unitOfWork.Commit();
   }
} 

В большинстве сценариев EF4 единица работы реализована как оболочка дляObjectContext.Другими словами, метод «Commit» в вашей единице работы будет просто выполнять «SaveChanges» для ObjectContext.

Следовательно, единица работы на самом деле не указывает наслужба или хранилище.Он просто работает с механизмом сохранения, который управляет.

2 голосов
/ 26 января 2011

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

Персистентный объект не может знать, является ли он частью большей единицы работы. У ответственной службы есть ссылки на все объекты модели и персистентности, которые составляют единицу работы. Служба также отвечает за управление соединениями из пула от имени персистентных объектов. Получите соединение, откройте транзакцию, выполните работу, подтвердите или откатите транзакцию и закройте соединение. Это работа службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...