在 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模式,如何创建“设置”功能,在其他用户控件中设置数据绑定项值?

[WPF] 使用 MVVM Toolkit 构建 MVVM 程序

mvvm框架是啥 它和其他框架的区别

MVVM 中视图模型的交互

在 Android 上使用 MVVM 时,每个 Activity 是不是应该有一个(且只有一个)ViewModel?