Architecture MVC,在哪里生成ViewModel类?

Architecture MVC,在哪里生成ViewModel类?,architecture,Architecture,应在何处创建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 {ge

应在何处创建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{
公共字符串名称{get;set;}
公共IList子项{get;set;}
}
公共类ObjectAViewModel{
public ObjectA ObjectA{get;set;}
公共IList 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{
公共字符串名称{get;set;}
公共IList子项{get;set;}
公共计算方法{get;set;}
公共十进制计算值{get;set;}
}

假设
ObjectA.CalculatedValue
是从存储库中的所有或部分
ChildB
对象(不仅仅是相关对象)中计算出来的,并且根据
CalculateMethod
值的不同来计算它们?我应该扩展
对象a
,在这种情况下,我应该把它放在哪里?与
ObjectA一起
或者,作为其他地方的数据?那么计算应该在哪里进行呢?

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

这似乎是一个非常重要的问题。这是一个思考的起点,也是其他讨论的起点

我来自Java背景,因此对您的世界没有直接的经验,但在概念层面上,我的想法是:

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

问题是模型最终可能会发送大量视图不关心的数据,请继续阅读

控制器对视图和模型的实际内容一无所知,但他们知道某些视图对某些模型感兴趣。因此,他们有责任选择一个合适的视图,并安排它获取所需的数据。控制员更像是一个交友机构,做介绍,然后走开

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