【进阶编程】MVVM框架的每层对应那些业务
在 MVVM(Model-View-ViewModel) 架构中,每一层 都承担着不同的责任并处理不同类型的业务逻辑。理解每层的业务角色有助于我们在开发过程中合理划分工作,提升代码的模块化、可测试性和可维护性。
以下是 MVVM 框架中每一层的职责以及它们通常对应的业务逻辑:
1. Model 层(模型层)
Model 层是 MVVM 模式中最接近 业务逻辑 和 数据存取 的一层,负责 数据的处理、验证和核心业务规则。
主要职责:
- 数据表示:定义应用的核心数据结构(如实体类、POCO 等),它们表示应用中使用的对象。
- 数据访问:与数据库、Web API、文件系统等进行交互,获取、存储和更新数据。
- 业务规则:实现应用程序的核心业务逻辑,例如验证规则、计算、决策等。
- 外部服务交互:与外部系统进行数据交换,如调用 REST API、SOAP 服务、文件系统操作等。
对应的业务逻辑:
- 数据存取:获取数据、保存数据、更新数据(如读取数据库、调用远程 API 等)。
- 数据验证:如用户输入验证、模型数据验证等。
- 核心算法:如计算订单总额、库存检查、价格计算等。
- 数据传输:如通过 DTO 或实体类进行数据传输。
示例:
public class OrderModel
{
public int OrderId { get; set; }
public decimal Price { get; set; }
public int Quantity { get; set; }
public decimal CalculateTotal()
{
return Price * Quantity;
}
}
2. ViewModel 层(视图模型层)
ViewModel 层充当 View(视图) 和 Model(模型) 之间的桥梁。它的主要职责是从 Model 层获取数据,并根据 View 的需求对数据进行转换或处理,处理与 UI 相关的逻辑。
主要职责:
- 数据绑定:将从 Model 层获取的数据与 View 层绑定,通常通过 数据绑定(Data Binding) 进行更新。
- 用户交互:接收来自 View 的用户输入(如按钮点击、文本框输入等),并执行相应的操作(例如,调用 Model 层的方法)。
- UI 状态管理:管理与 UI 相关的状态,如启用/禁用按钮、显示错误信息等。
- 业务流程控制:处理一些 UI 相关的业务逻辑,如加载数据、提交表单等。
对应的业务逻辑:
- UI 状态管理:例如,控制控件的启用/禁用、显示加载指示器、显示错误信息。
- 数据格式化:将 Model 层的数据格式化为适合 View 显示的形式。
- 用户输入处理:处理用户在 UI 上的操作,如按钮点击、文本框内容变化、选项卡切换等。
- 命令执行:接收来自 View 的操作命令,调用 Model 层执行相关操作(例如,获取数据、更新数据等)。
示例:
public class OrderViewModel : INotifyPropertyChanged
{
private OrderModel _order;
private string _orderTotal;
public OrderViewModel()
{
_order = new OrderModel();
CalculateTotalCommand = new RelayCommand(CalculateTotal);
}
public ICommand CalculateTotalCommand { get; set; }
public string OrderTotal
{
get { return _orderTotal; }
set
{
_orderTotal = value;
OnPropertyChanged(nameof(OrderTotal));
}
}
private void CalculateTotal()
{
OrderTotal = _order.CalculateTotal().ToString("C");
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
3. View 层(视图层)
View 层负责应用的 用户界面 和用户交互,通常与操作系统或框架提供的 UI 控件进行绑定。它是用户直接接触到的界面,所有的用户交互(点击按钮、输入文本、选择选项等)都会在 View 层捕获,并通过 ViewModel 来处理。
主要职责:
- 用户界面展示:展示数据(通过数据绑定从 ViewModel 获取)。
- 用户输入捕获:捕获用户的交互,如按钮点击、文本框输入、滑动条调整等。
- 交互反馈:向用户提供反馈信息,例如加载进度、错误信息、成功提示等。
- 视图更新:通过 ViewModel 中的数据绑定,动态地更新 UI。
对应的业务逻辑:
- 显示数据:从 ViewModel 获取格式化后的数据并展示在 UI 控件上。
- 接收用户输入:捕获用户输入并传递给 ViewModel,例如,按钮点击事件、表单提交等。
- UI 反馈:例如,显示错误消息、禁用按钮、显示加载动画等。
示例:
<Button Content="Calculate Total" Command="{Binding CalculateTotalCommand}" />
<TextBlock Text="{Binding OrderTotal}" />
4. 跨层业务逻辑的划分
a. 核心业务逻辑(通常在 Model 层)
- 数据操作:数据库访问、外部 API 调用等。
- 数据验证:例如订单的有效性、用户输入验证等。
- 核心计算:例如订单总额计算、折扣计算等。
b. UI 相关逻辑(通常在 ViewModel 层)
- UI 状态管理:例如按钮启用/禁用、加载提示显示等。
- 用户交互控制:例如按钮点击、文本框输入的响应。
- 命令和事件处理:接收来自 View 的命令并触发相关操作。
c. UI 显示逻辑(通常在 View 层)
- 显示数据:通过数据绑定从 ViewModel 获取并显示数据。
- 捕获用户输入:通过 UI 控件接收用户输入并传递给 ViewModel。
5. 总结
层级 | 主要职责 | 对应的业务逻辑 |
---|---|---|
Model | 数据表示、数据存取、核心业务规则 | 数据访问、数据验证、核心计算、外部服务交互 |
ViewModel | 数据绑定、UI 状态管理、用户交互 | UI 状态管理、数据格式化、用户输入处理、命令执行 |
View | 用户界面展示、用户输入捕获 | 显示数据、接收用户输入、UI 反馈 |
- Model 层关注数据和核心业务逻辑。
- ViewModel 层负责数据转换、UI 状态控制以及用户交互。
- View 层则专注于展示和捕获用户的操作。
在这种划分下,Model 和 ViewModel 层包含了大部分业务逻辑,而 View 层主要关注用户界面的呈现和用户交互的捕捉。通过 MVVM 模式的分层结构,可以保持业务逻辑和 UI 代码的高度分离,便于测试、维护和扩展。