C# 中的命令查询分离

2025年2月5日 | 阅读 4 分钟

命令查询分离 是一种软件原则,它规定一个方法要么是一个改变信息的操作,要么是一个检索信息的操作。

这里,命令指的是改变对象状态或对对象执行操作的方法。命令会改变系统状态。这些方法大多具有 void 返回类型。命令的一些示例是更新数据库记录或触发事件。

查询指的是返回数据或检索数据而不更新对象状态的方法。这些方法不改变状态并返回系统当前状态。一些常见示例是检索用户配置文件信息和检查订单状态。

分离查询和命令的原因

  • 清晰性和可读性: 通过分离查询和命令,开发人员可以轻松区分操作并高效地使用方法。
  • 安全性: 改变状态并返回数据的方法可能不可预测。因此,分离方法可以给出期望的输出。
  • 改进的测试: 当命令和查询分离时,测试变得更加直接。
  • 单一职责原则: 这规定一个类或方法应该只有一个改变的理由。

命令查询分离的一些常见示例

1. 用户管理系统

在此系统方法中,'UpdateUserPassword' 被视为命令。它以 'userId'、'newPassword' 作为参数,并使用给定密码更新密码。'GetUserDetails' 方法被视为查询,因为它返回当前登录用户的详细信息。

2. 银行系统

在此系统方法中,'WithdrawFunds' 被视为命令。它以 'accountId' 和 'amount' 作为参数,并将金额添加到总余额中。方法 'GetAccountBalance' 以 'accountId' 作为参数并返回账户中的总余额。

示例

让我们看一个程序来演示 C# 中的命令查询分离。

输出

Command Query Separation in C#

说明

上面的 C# 程序包含 6 个类。'Account' 包含余额和交易等详细信息。'Transaction' 包含金额、日期和资金类型。'CreateAccountCommand'、'DepositFundsCommand' 和 'WithdrawFundsCommand' 类用于创建、添加和提取账户中的资金。'GetAccountBalanceQuery' 和 'GetTransactionHistoryQuery' 用于检索余额和交易历史。'BankCommandHandler' 类用于处理与账户相关的操作。'BankQueryHandler' 类用于检索账户信息和交易历史。

创建了一个名为 'Ramu' 且 ID 为 '1' 的账户,向账户 1 存入一千卢比,然后使用相应的方法提取 500 卢比。之后,使用查询方法打印当前余额。最后,显示交易历史。