代码之家  ›  专栏  ›  技术社区  ›  Carl Hörberg

MVC,在哪里生成ViewModel类?

  •  0
  • Carl Hörberg  · 技术社区  · 16 年前

    在何处创建ViewModel?在服务层,在控制器中?

    public class ObjectA {
     public string Name {get;set;}
     public IList<ChildB> Children {get;set;}
    }
    
    public class ObjectAViewModel {
     public ObjectA ObjectA {get;set;}
     public IList<ChildB> SelectableChildren {get;set;}
    }
    

    如果必须在运行时计算Objecta上的某些属性怎么办?

    public class ObjectA {
     public string Name {get;set;}
     public IList<ChildB> Children {get;set;}
     public CalculateMethod {get;set;}
     public decimal CalculatedValue {get;set;}
    }
    

    让我们说 ObjectA.CalculatedValue 全部或部分 ChildB 存储库中的对象(不仅是相关对象),并且根据 CalculateMethod 价值?我应该延长 ObjectA 在这种情况下,我应该把它放在哪里?一起 客体 或者,作为一个DTO去别的地方?计算应该在哪里进行?

    2 回复  |  直到 16 年前
        1
  •  1
  •   djna    16 年前

    这似乎是一个非常重要的问题。有一个思考的起点 here 并从那里提及其他讨论。

    我来自Java背景,所以没有直接体验你的世界,但在概念层面上,我的想法是:

    模型对视图一无所知,它们只提供数据,还可以提供视图可能会发现有用的验证规则。例如:这里有一些日期,这个字段是“部门”字段。这里是所有有效部门的列表,作为一个模型,我对您一无所知,视图先生,但您可能会从该部门列表中填充一个下拉列表。

    问题在于,模型最终会发送大量视图不关心的数据,继续阅读……

    控制器不知道视图和模型的实际内容,但他们知道某些视图对某些模型感兴趣。因此,他们有责任选择一个适当的视图,并安排它获取所需的数据。管家很像一家婚介公司,先做介绍,然后走开。

    因此,在最一般的场景中,视图本身被赋予一个模型,并帮助自己获得所需的数据。所以视图知道模型,但反之亦然。现在作为一个实现细节,我们可以从关系中提取一个viewModel类,以保存视图的有趣数据,还可以将逻辑提取到viewModelFactory类。实际上,控制器可能有责任根据我们要访问的视图选择适当的ViewModelFactory,因此在某种意义上,控制器正在“创建”ViewModel,但逻辑是(概念)视图的责任。

        2
  •  0
  •   Gregoire    16 年前

    对于您的第一个问题,我会在控制器中说,因为它是谁知道它将服务于哪个视图,所以这个视图需要知道什么。