news 2026/7/10 17:14:26

nArchitecture命令查询职责分离(CQRS)模式:LoginCommand与GetListUserQuery实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nArchitecture命令查询职责分离(CQRS)模式:LoginCommand与GetListUserQuery实现

nArchitecture命令查询职责分离(CQRS)模式:LoginCommand与GetListUserQuery实现

【免费下载链接】nArchitectureInspired by Clean Architecture, nArchitecture is a monolith project which uses advanced techniques.项目地址: https://gitcode.com/gh_mirrors/na/nArchitecture

nArchitecture是一个受Clean Architecture启发的单体项目,它采用了命令查询职责分离(CQRS)模式等先进技术,为开发者提供了清晰的代码结构和高效的开发体验。

CQRS模式简介:分离命令与查询的强大架构

命令查询职责分离(CQRS)是一种将系统的读写操作分离的设计模式。在nArchitecture中,这一模式得到了充分体现,通过将数据修改操作(命令)和数据查询操作(查询)分开处理,提高了系统的可维护性和扩展性。

命令(Command):改变系统状态的操作

命令用于执行创建、更新或删除等会改变系统状态的操作。在nArchitecture中,所有命令类都实现了IRequest接口,这使得它们可以被MediatR库处理,实现了请求与处理的解耦。

查询(Query):获取系统状态的操作

查询用于获取系统状态,不会对数据产生任何修改。与命令类似,查询类也实现了IRequest接口,但它们返回的是查询结果而非修改确认。

LoginCommand:身份验证的命令实现

LoginCommand是nArchitecture中处理用户登录的命令,它位于src/starterProject/Application/Features/Auth/Commands/Login/LoginCommand.cs文件中。

LoginCommand类结构

LoginCommand实现了IRequest<LoggedResponse>接口,表示它是一个返回LoggedResponse类型结果的请求:

public class LoginCommand : IRequest<LoggedResponse> { public UserForLoginDto UserForLoginDto { get; set; } public string IpAddress { get; set; } // 构造函数... }

LoginCommandHandler:命令的具体实现

LoginCommandHandler实现了IRequestHandler<LoginCommand, LoggedResponse>接口,负责处理登录逻辑:

public class LoginCommandHandler : IRequestHandler<LoginCommand, LoggedResponse> { private readonly AuthBusinessRules _authBusinessRules; private readonly IAuthenticatorService _authenticatorService; private readonly IAuthService _authService; private readonly IUserService _userService; // 构造函数注入依赖... public async Task<LoggedResponse> Handle(LoginCommand request, CancellationToken cancellationToken) { // 登录逻辑实现... } }

在Handle方法中,实现了用户验证、令牌生成等完整的登录流程,体现了命令模式处理复杂业务逻辑的优势。

GetListUserQuery:用户列表查询的实现

GetListUserQuery是用于获取用户列表的查询,位于src/starterProject/Application/Features/Users/Queries/GetList/GetListUserQuery.cs文件中。

GetListUserQuery类结构

GetListUserQuery实现了IRequest<GetListResponse<GetListUserListItemDto>>ISecuredRequest接口,后者用于实现权限控制:

public class GetListUserQuery : IRequest<GetListResponse<GetListUserListItemDto>>, ISecuredRequest { public PageRequest PageRequest { get; set; } public string[] Roles => [UsersOperationClaims.Read]; // 构造函数... }

GetListUserQueryHandler:查询的具体实现

GetListUserQueryHandler负责处理用户列表查询:

public class GetListUserQueryHandler : IRequestHandler<GetListUserQuery, GetListResponse<GetListUserListItemDto>> { private readonly IUserRepository _userRepository; private readonly IMapper _mapper; // 构造函数注入依赖... public async Task<GetListResponse<GetListUserListItemDto>> Handle( GetListUserQuery request, CancellationToken cancellationToken ) { IPaginate<User> users = await _userRepository.GetListAsync( index: request.PageRequest.PageIndex, size: request.PageRequest.PageSize, enableTracking: false, cancellationToken: cancellationToken ); GetListResponse<GetListUserListItemDto> response = _mapper.Map<GetListResponse<GetListUserListItemDto>>(users); return response; } }

在Handle方法中,通过调用IUserRepository的GetListAsync方法获取用户数据,并使用AutoMapper将结果映射为响应DTO,实现了高效的数据查询和转换。

CQRS在nArchitecture中的应用优势

nArchitecture通过CQRS模式的应用,带来了以下优势:

  1. 关注点分离:命令和查询的分离使得代码职责更加清晰,便于维护和扩展。

  2. 性能优化:查询操作可以针对读取性能进行优化,而命令操作可以专注于数据一致性。

  3. 安全性增强:通过ISecuredRequest接口,可以方便地为查询和命令添加不同的权限控制,如GetListUserQuery中定义的Roles属性。

  4. 可测试性提高:分离的设计使得单元测试更加容易,可以分别测试命令和查询的逻辑。

如何在nArchitecture中实现自己的CQRS模式

要在nArchitecture中实现自己的CQRS模式,只需遵循以下步骤:

  1. 创建命令或查询类,实现相应的IRequest接口。

  2. 创建对应的Handler类,实现IRequestHandler接口。

  3. 在Handler中注入所需的服务和依赖。

  4. 实现Handle方法,编写具体的业务逻辑。

  5. 在控制器中使用MediatR发送命令或查询,如在AuthController中使用LoginCommand:

LoginCommand loginCommand = new() { UserForLoginDto = userForLoginDto, IpAddress = getIpAddress() };

或者在UsersController中使用GetListUserQuery:

GetListUserQuery getListUserQuery = new() { PageRequest = pageRequest };

通过这种方式,你可以轻松地在nArchitecture中应用CQRS模式,构建清晰、高效的应用程序。

总结

nArchitecture通过实现命令查询职责分离(CQRS)模式,为开发者提供了一个清晰、高效的架构设计。LoginCommand和GetListUserQuery作为命令和查询的典型实现,展示了如何将业务逻辑分离为修改操作和查询操作,从而提高系统的可维护性、可扩展性和性能。

无论是处理复杂的身份验证逻辑,还是实现简单的数据查询,CQRS模式都能帮助开发者构建更加健壮和灵活的应用程序。如果你正在寻找一个采用先进架构模式的项目作为学习或开发的基础,nArchitecture无疑是一个值得考虑的选择。

要开始使用nArchitecture,只需克隆仓库:

git clone https://gitcode.com/gh_mirrors/na/nArchitecture

探索其中的代码结构,你会发现更多关于Clean Architecture和CQRS模式的最佳实践。

【免费下载链接】nArchitectureInspired by Clean Architecture, nArchitecture is a monolith project which uses advanced techniques.项目地址: https://gitcode.com/gh_mirrors/na/nArchitecture

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 17:11:07

LV3296与STM32F765ZI的高精度数据采集系统设计

1. 项目概述&#xff1a;LV3296与STM32F765ZI的协同工作在嵌入式系统开发领域&#xff0c;LV3296作为一款高性能信号处理芯片&#xff0c;与STM32F765ZI微控制器的组合为实时数据采集和处理提供了理想的解决方案。这个组合特别适合需要精确时序控制和复杂信号处理的场景&#x…

作者头像 李华
网站建设 2026/7/10 17:09:33

Unread测试策略:Rspec测试用例设计与覆盖率提升

Unread测试策略&#xff1a;Rspec测试用例设计与覆盖率提升 【免费下载链接】unread Handle unread records and mark them as read with Ruby on Rails 项目地址: https://gitcode.com/gh_mirrors/un/unread Unread是一个基于Ruby on Rails的未读记录管理工具&#xff…

作者头像 李华
网站建设 2026/7/10 17:09:14

The Deck网络架构深度解析:Socket.IO实现多人离线游戏通信

The Deck网络架构深度解析&#xff1a;Socket.IO实现多人离线游戏通信 【免费下载链接】thedeck The Deck: An Open-Source, Cross-Platform, Mobile, Turn by Turn Card Game Engine in Flutter 项目地址: https://gitcode.com/gh_mirrors/th/thedeck 想要体验无需网络…

作者头像 李华
网站建设 2026/7/10 17:07:36

BetterNCM安装器:3分钟为网易云音乐打造个性化插件管理器

BetterNCM安装器&#xff1a;3分钟为网易云音乐打造个性化插件管理器 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否厌倦了网易云音乐千篇一律的界面&#xff1f;想要扩展播放器…

作者头像 李华
网站建设 2026/7/10 17:06:10

MCP服务器开发入门:面向初学者的完整技术指南

MCP服务器开发入门&#xff1a;面向初学者的完整技术指南 【免费下载链接】mcp-marketplace This is the official repository for submitting MCP servers to be included in Clines MCP Marketplace. If you’ve built an MCP server and want it to be discoverable and eas…

作者头像 李华