Thunderdome action invoker asp.net mvc - PullRequest
3 голосов
/ 12 мая 2009

Я знаю основную идею принципа грома (один объект входит, один объект уходит), но я не видел ни одного реального примера этого в asp.net mvc. Это хороший пример принципа грома

  public ActionResult Index(Employee employee)
        {
             //some actions here
             return View(employeeViewModel);
        }

А как же утверждение

Классы контроллера никогда не будут непосредственно подвержены чему-либо связанному HttpContext

Как должен выглядеть призыватель действий? Не могли бы вы привести примеры и юнит-тесты для него?


из http://codebetter.com/blogs/jeremy.miller/archive/2008/10/23/our-opinions-on-the-asp-net-mvc-introducing-the-thunderdome-principle.aspx

«Принцип Thunderdome» - все методы Controller принимают один объект ViewModel (или ноль объектов в некоторых случаях) и возвращают один объект ViewModel (один объект входит, один объект покидает). Классы Controller НИКОГДА не будут напрямую подвергаться воздействию всего, что связано с HttpContext. Ничто так не заставляет меня плакать, как видеть людей, пытающихся написать тесты, которые высмеивают или заглушают новый интерфейс IHttpContextWrapper. Аналогично, методы Controller не возвращают объекты ViewResult и, как правило, отделены от всей инфраструктуры MVC. Мы очень рано приняли эту стратегию, чтобы сделать механическое тестирование контроллера проще.

Но я хочу знать, как это сделать? как написать такой контроллер действия invoker? потому что обычно мы должны издеваться над httpcontext

Ответы [ 2 ]

1 голос
/ 12 мая 2009

В примере ASP.NET MVC в источнике Oxite rev2 приведен пример того, как добиться вызова действия OMIOMO (Thunderdome) в ASP.NET MVC.

В частности, OxiteActionInvoker: http://oxite.codeplex.com/SourceControl/changeset/view/31497#442766

И здесь вы можете увидеть контроллер, который является OMIOMO: http://oxite.codeplex.com/SourceControl/changeset/view/31497#442745

Также интересно, что ребята из Oxite смогли сделать так, чтобы у вас были фильтры действий с поддержкой IoC (вместо того, чтобы указывать все фильтры в действиях - возможное нарушение OCP, поскольку тогда действие знать все возможные способы его использования). Это можно увидеть в действии в методе OxiteActionInvoker «GetFilters», где он выполняет команду FilterRegistry, чтобы загрузить все зарегистрированные фильтры для этого действия.

0 голосов
/ 12 мая 2009

Это наиболее чистый подход «принцип грома (один объект входит, один объект уходит)» для приложений MVC. Вы всегда должны пытаться использовать trhings в этом стиле и избегать использования ViewData или ViewTemp, чтобы получить необходимые данные в представлении.

Простой пример вы можете посмотреть в проекте jscportal здесь текст ссылки

например в jscportal\JSC.Portal.Web\Controllers\TemplatesController.cs у вас будут свои примеры, как вы хотите:

public ActionResult List()
{
    IList<Template> templates = Service.GetAll();
    return View(templates);
}

public ActionResult Edit(int id)
{
    Template t = Service.GetById(id, false);
    return View(t);
}

удачи!

...