2009-12-01 57 views
0

应该在哪里创建ViewModel?在服务层中,在控制器中?MVC,在哪里生成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,在这种情况下,我应该在哪里放?与ObjectA一起,还是作为其他地方的DTO?计算在哪里进行?

回答

1

这似乎是一个不平凡的问题。有一个思考的起点here并从那里引用其他讨论。

我从Java的背景是,因此没有你的世界的直接经验,但是在概念层面我的想法有云:

模型不知道什么意见,只是它的数据提供并且还可以提供视图可能有用的验证规则。例如:这里有一些日期,这个字段是“部门”字段。以下是所有有效部门的列表,作为一个模型,我不知道你是Mr View先生,而是猜测你可能会从该部门列表中填充一个下拉列表。

但问题是,该模型可以提早结束,视图不关心,阅读大量的数据...

控制器不知道的实际观看任何内容和模型,但他们确实知道某些观点对某些模型感兴趣。所以他们有责任选择一个审核视图并安排它来获取它所需要的数据。财务总监更像是一个约会机构,进行介绍,但随后离职。

因此,在最常见的情况下,View本身会被赋予一个模型,并帮助自己处理它所需的数据。所以视图知道模型,但反之亦然。现在作为一个implmentation细节,我们可以从这个关系中取出一个ViewModel类,以保存视图的有趣数据,并且我们也可以将逻辑提取到ViewModelFactory类。控制器可能实际上有责任根据我们将要使用的View来选择适当的ViewModelFactory,因此从某种意义上说Controller是“制作”ViewModel的,但逻辑是(概念上的)View的责任。

0

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