3

我知道 Thunderdome 原理的基本概念(一个对象进入,一个对象离开),但我在 asp.net mvc 中没有看到任何真实世界的示例。是雷电原理的好例子吗

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

但是声明呢

Controller 类永远不会直接暴露给与 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 基础结构分离。我们很早就采用了这种策略,以使控制器测试在机械上更简单。

但我想知道该怎么做?如何编写这样的控制器动作调用程序?因为通常我们必须模拟 httpcontext

4

2 回答 2

1

在 Oxite rev2 源代码中有一个如何在 ASP.NET MVC 中实现 OMIOMO (Thunderdome) Action 调用程序的示例。

特别是 OxiteActionInvoker: http ://oxite.codeplex.com/SourceControl/changeset/view/31497#442766

在这里你可以看到一个 OMIOMO 控制器:http: //oxite.codeplex.com/SourceControl/changeset/view/31497#442745

同样有趣的是,Oxite 人员能够做到这一点,这样您就可以拥有 IoC-able 动作过滤器(而不是必须在动作上指定所有过滤器 - 可能违反 OCP,因为动作必须知道所有可能的使用方式)。您可以在 OxiteActionInvoker 方法“GetFilters”中看到这一点,它点击 FilterRegistry 以加载该操作的所有注册过滤器。

于 2009-05-12T13:14:44.507 回答
0

这是 MVC 应用程序最干净的方法“thunderdome 原则(一个对象进入,一个对象离开)”。您应该始终尝试以这种方式进行操作,并避免使用 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);
}

祝你好运!

于 2009-05-12T09:12:55.527 回答