MVVM架构疑问:未直接用于视图的类是否属于模型?嵌套类该如何架构?
关于MVVM模型层的疑问解答
咱们先逐个拆解你的问题:
1. 未直接用于视图的类是否仍属于模型?
当然属于。MVVM里的模型层核心职责是封装业务数据和业务逻辑,它的存在根本不是为了对接视图——视图只是模型数据的消费者之一。哪怕某个类完全不跟视图打交道,只要它是支撑你的业务数据结构、承载业务规则的一部分,它就归属于模型层。
2. 仅作为模型一部分、永远不直接用于视图的类是否属于模型?
必须属于。模型层不是一堆孤立的“视图绑定类”,它是一个可以嵌套、分层的结构。比如你例子里的Address,它是UserModel的组成部分,负责描述用户的地址数据,不管视图会不会直接展示它,它都是模型层的一部分。
而且MVVM的架构核心是视图(View)、视图模型(ViewModel)、模型(Model)的职责分离:
- Model:只管数据和业务逻辑,不关心任何视图相关的东西
- ViewModel:作为中间层,把Model的数据转换成View能使用的格式,处理视图交互逻辑
- View:只负责展示和接收用户输入,不处理业务逻辑
针对你的UserModel和Address例子
你完全不需要创建AddressViewModel,除非你的Address需要处理视图相关的逻辑——比如地址输入的实时验证、UI状态(比如“是否展开地址详情”)这类和视图强相关的东西。
如果Address只是纯数据结构(比如包含街道、城市、邮编等字段),或者只包含业务逻辑(比如验证地址格式是否合法),那一个单独的Address类(你可以叫它AddressModel,也可以直接叫Address,只要团队命名规范统一就行)就足够了。把它作为UserModel的属性,完全符合MVVM的架构要求。
举个更清晰的代码例子:
// 模型层的Address类,纯数据+业务逻辑 public class Address { public string Street { get; set; } public string City { get; set; } public string ZipCode { get; set; } // 业务逻辑:验证地址是否合法 public bool IsValid() { return !string.IsNullOrEmpty(Street) && !string.IsNullOrEmpty(City) && !string.IsNullOrEmpty(ZipCode); } } // 模型层的UserModel类 public class UserModel { private Address _address; public Address Address { get => _address; set => _address = value; } // 其他用户属性... } // 如果需要对接视图,创建对应的ViewModel即可 public class UserViewModel { private UserModel _userModel; public UserViewModel(UserModel userModel) { _userModel = userModel; } // 把模型数据暴露给视图,必要时做格式转换 public string UserFullAddress => $"{_userModel.Address.Street}, {_userModel.Address.City}, {_userModel.Address.ZipCode}"; // 视图相关的逻辑,比如保存用户的命令 public ICommand SaveUserCommand { get; } }
这样拆分的话,类图也会非常清晰:模型层包含UserModel和Address,视图模型层包含UserViewModel,视图层依赖UserViewModel,完全贴合MVVM的职责分离原则。
内容的提问来源于stack exchange,提问作者Red'n'Black
相关产品推荐
相关产品推荐

