在 MVVM 设计模式中,模型是不是应该包含其他模型?
Posted
技术标签:
【中文标题】在 MVVM 设计模式中,模型是不是应该包含其他模型?【英文标题】:In the MVVM design pattern, should models contain other models?在 MVVM 设计模式中,模型是否应该包含其他模型? 【发布时间】:2018-09-04 03:53:41 【问题描述】:我认为我没有见过这样的例子,但我也没有读到任何明确声明不应该这样做的地方。例如,假设我有一些用户模型,其中包含常见的东西,如名字姓氏等:
public class UserModel
private int userID;
public int UserID
get return userID;
public string FirstName get; set;
public string LastName get; set;
public string MiddleInitial get; set;
...
如果我要严格遵循 MVVM 模式,是否允许拥有例如其他模型的列表
public class UserModel
...
public List<SomeOtherModel> SomeList get; set;
或者模型应该只有简单类型?
【问题讨论】:
是的,没关系,否则会很麻烦 让视图模型包含集合是非常好的,也很常见。 是的。您可能会感到困惑的是,一个虚拟机是否应该包含另一个虚拟机?当暴露直接 V 不关心的子 VM 时,复合 VM 没有任何意义。另外,这有点像在 VM 中放置过多的业务逻辑 【参考方案1】:很简单,是的。
在进行 MVVM 时,您需要稍微改变一下观点。 “模型”的定义与 MVC 不同,而是包含所有不是视图和视图模型的内容。这意味着“模型”是一个数据实体(即 POCO),它包括任何服务或控制器,它包括业务逻辑等:
型号
MVVM 中的模型是应用程序域模型的实现,其中包括数据模型以及业务和验证逻辑。模型对象的示例包括存储库、业务对象、数据传输对象 (DTO)、普通旧 CLR 对象 (POCO) 以及生成的实体和代理对象。
引自MSDN文章The MVVM Pattern
既然您已经改变了观点,如果您的问题变成POCO (DTO) 是否应该包含其他 POCO?,那么答案仍然是是。 p>
【讨论】:
与 MS 对最佳实践的定义相反,POCO 是一种最佳实践 - 没有应用层的类; 不包含业务逻辑。 BL 也不应该进入虚拟机。无论 MVVM 宗教如何,总有 SOLID 原则可供遵循 @MickyD 同意,一旦 POCO 中包含业务逻辑,它就会成为业务对象。以上是关于在 MVVM 设计模式中,模型是不是应该包含其他模型?的主要内容,如果未能解决你的问题,请参考以下文章
我应该在 Silverlight 项目中使用模型-视图-视图模型 (MVVM) 模式吗?
遵循MVVM模式,如何创建“设置”功能,在其他用户控件中设置数据绑定项值?