MST
星途 面试题库

面试题:C#中CQRS架构里查询与命令的职责划分

在C#的CQRS架构中,阐述查询(Query)和命令(Command)的主要职责分别是什么?并举例说明在一个简单的用户管理系统里,哪些操作可能会被设计成查询,哪些会被设计成命令。
43.7万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

查询(Query)的主要职责

  • 职责:负责从系统中检索数据,目的是获取信息,不会对系统的状态进行修改。它主要用于向用户呈现数据,例如在报表、展示页面等场景中。
  • 特点:通常是幂等的,即多次执行相同的查询会返回相同的结果,因为它不改变系统状态。

命令(Command)的主要职责

  • 职责:用于改变系统的状态,比如创建、更新或删除数据。命令代表了系统中的一个动作,执行命令会导致系统状态发生变化。
  • 特点:一般不是幂等的,多次执行可能会产生不同的结果,因为每次执行都会改变系统状态。

在简单用户管理系统中的示例

查询操作示例

  • 获取所有用户列表:用户管理模块可能需要向管理员展示所有注册用户的列表,这时候就需要一个查询操作。它从数据库中检索所有用户的信息并返回,不会改变用户的任何数据。例如:
public IEnumerable<User> GetAllUsers()
{
    // 从数据库获取用户数据逻辑
    return _dbContext.Users.ToList();
}
  • 根据用户名查询用户信息:当管理员想要查看某个特定用户名的详细信息时,可通过查询操作实现。它同样只是获取数据,不改变数据。例如:
public User GetUserByUsername(string username)
{
    return _dbContext.Users.FirstOrDefault(u => u.Username == username);
}

命令操作示例

  • 创建新用户:当有新用户注册时,需要执行一个创建用户的命令。这个操作会在系统中新增一条用户记录,改变了系统的状态(增加了用户数据)。例如:
public void CreateUser(User user)
{
    _dbContext.Users.Add(user);
    _dbContext.SaveChanges();
}
  • 更新用户密码:如果用户忘记密码并进行密码重置,这就是一个更新用户数据的命令操作,它改变了用户的密码字段,从而改变了系统状态。例如:
public void UpdateUserPassword(string username, string newPassword)
{
    var user = _dbContext.Users.FirstOrDefault(u => u.Username == username);
    if (user != null)
    {
        user.Password = newPassword;
        _dbContext.SaveChanges();
    }
}
  • 删除用户:当某个用户违反规定,管理员决定删除该用户账号时,执行的就是删除用户的命令,它从系统中移除用户数据,改变了系统状态。例如:
public void DeleteUser(string username)
{
    var user = _dbContext.Users.FirstOrDefault(u => u.Username == username);
    if (user != null)
    {
        _dbContext.Users.Remove(user);
        _dbContext.SaveChanges();
    }
}