【问题标题】:thunderdome action invoker asp.net mvcThunderdome 动作调用程序 asp.net mvc
【发布时间】:2010-10-25 11:55:26
【问题描述】:

我知道 Thunderdome 原理的基本概念(一个对象进入,一个对象离开),但我在 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 基础结构分离。我们很早就采用了这种策略,以简化控制器测试的机械性。

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

【问题讨论】:

    标签: asp.net-mvc controller fubumvc


    【解决方案1】:

    这是 MVC 应用程序最干净的方法“thunderdome 原则(一个对象进入,一个对象离开)”。您应始终尝试以这种方式进行操作,并避免使用 ViewData 或 ViewTemp 以在视图中获取必要的数据。

    对于一个简单的示例,您可以在此处查看 jscportal 项目link text

    例如在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);
    }
    

    祝你好运!

    【讨论】:

    • 是的,但是隐藏 httpcontext 呢?关于测试这样的控制器?
    • 如果你让它这样,那么你将不得不恢复你对服务中正在发生的事情的测试,假设你在这种情况下只测试来自存储库的可能性。如果您想进入 HttpContext,则可以使用来自 haacked 的想法:请参阅haacked.com/archive/2007/12/09/…
    【解决方案2】:

    在 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 的操作过滤器(而不是必须在操作上指定所有过滤器 - 可能违反 OCP,因为该操作将具有了解所有可能的使用方式)。您可以在 OxiteActionInvoker 方法“GetFilters”中看到这一点,它会点击 FilterRegistry 以加载该操作的所有已注册过滤器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      相关资源
      最近更新 更多