MVC ViewEngineResult实际上是一种设计_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MVC ViewEngineResult实际上是一种设计

MVC ViewEngineResult实际上是一种设计

 2014/6/15 17:15:56  _DN  程序员俱乐部  我要评论(0)
  • 摘要:概述MVC中,IView代表一个视图,最后是要表现为HTML或者其他的HttpResponse的应答流的;IViewEngine提供了类似工厂的作用或者提供器的作用,以返回一个视图。OO的视觉:不要管IView,IViewEngine怎么实现,只关心其代表着什么,能做什么,这样才能接地气(业务啊,框架设计啊等等),就不会被一个新事物给唬住,容易进入牛角尖。publicinterfaceIView{voidRender(ViewContextviewContext
  • 标签:MVC view 设计

概述

    MVC中,

  •    IView代表一个视图,最后是要表现为HTML或者其他的HttpResponse的应答流的;
  •    IViewEngine提供了类似工厂的作用或者提供器的作用,以返回一个视图。

    OO的视觉:不要管IView,IViewEngine怎么实现,只关心其代表着什么,能做什么,这样才能接地气(业务啊,框架设计啊等等),就不会被一个新事物给唬住,容易进入牛角尖。

public interface IView
{
    void Render(ViewContext viewContext, TextWriter writer);
}
public interface IViewEngine
{
    ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);
    ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);
    void ReleaseView(ControllerContext controllerContext, IView view);
}

    但是从上面的设计来看,IViewEngineFind*方法并非返回一个IView对象,而是返回一个IViewEngineResult对象,为什么会这样呢?

二义性

    可以这么说,逻辑思维有大部分工作都在解决二义性多义性问题。

    这里的二义性,可以从ViewEngineResult的定义可以看到:

public class ViewEngineResult
{
    public ViewEngineResult(IEnumerable<string> searchedLocations);
    public ViewEngineResult(IView view, IViewEngine viewEngine);
   
    public IEnumerable<string> SearchedLocations { get; }

    public IView View { get; }
    public IViewEngine ViewEngine { get; }
}

     二义性的体现:

  • CASE 1:查找视图成功,则返回一个View以及引用一个ViewEngine;
  • CASE 2:查找视图失败,则返回一个字符串列表SearchedLocations ,以显示搜索过的位置,方便跟踪调试。

   有人会说,这样增加一个Result完全没有必要,直接抛出异常就可以了,恭喜,你这样说,没问题;

   但是这篇文章想要强调一种设计视角,侧重点在设计,所以,理解这样的设计,以及学会运用这样的设计也是一种OO精神的体现。

  总结:如果一个操作结果(Operation Result)有多种返回结果(二义性或多义性),或者拥有众多的数据(一次返回多个数据对象,如Person|Order|OrderDetails),则可以考虑将结果封装为***Result,以用一个***Result来携带所有的数据,以及所有的可能,除非操作结果真的鬼死复杂。

发表评论
用户名: 匿名