Где вызывать UnitOfWork.Commit () в приложении Asp.Net MVC - PullRequest
2 голосов
/ 17 декабря 2010

Где мне позвонить Commit() на мой UnitOfWork в приложении Asp.Net MVC? И все еще держу мой контроллер на контроллере.

Я использую HttpModule? Создать базовый контроллер и использовать OnActionExecuted? Или Global.asax: Application_EndRequest()?

Ответы [ 2 ]

4 голосов
/ 17 декабря 2010

Ваш контроллер должен выглядеть примерно так:

[HttpPost]
public ActionResult SubmitOrder(Order o)
{
   try
   {
       repository.Add(o);
       unitOfWork.Commit();
   }
   catch (YourCustomExceptionClass exc) 
   {
      ModelState.AddError(exc.ToString());
   }

   return View();
}

unitOfWork должен быть объявлен на уровне контроллера как:

IUnitOfWork unitOfWork;

И вводится в ctor контроллера - предпочтительно с DI на HTTP-запрос.

Если подумать - единицей работы в контексте веб-приложения обычно является HTTP-запрос.

А HTTP-запрос направлен только на один метод действия для выполнения работы. Конечно, у вас есть шаблон PRG (перенаправление на действие HttpGet впоследствии), но для каждого HTTP-запроса должен быть только 1 [HttpPost] вызов действия.

Поэтому имеет смысл зафиксировать UoW на уровне метода действия.

У вас должно быть две реализации IUnitOfWork:

  • EntityFrameworkUnitOfWork : IUnitOfWork
  • InMemoryUnitOfWork : IUnitOfWork

Так что при модульном тестировании - просто введите InMemoryUnitOfWork (который фиксирует изменения в статический List<T>, например)

0 голосов
/ 17 декабря 2010

Похоже, ваш пользовательский интерфейс должен отправить вызов commit контроллеру домена, который затем должен передать вызов соответствующим сторонам на уровне домена.

...