Task 5.1 Implementation Summary: 创建共享应用层概念
任务概述
任务: 5.1 创建共享应用层概念
- 创建 application/shared/interfaces.py,定义 CommandHandler、QueryHandler 协议
- 创建 application/shared/exceptions.py,定义 ApplicationException、ResourceNotFoundException、ValidationException
- Requirements: 1.4, 6.1
实现内容
1. 接口定义 (interfaces.py)
创建了两个核心协议接口,遵循 CQRS(命令查询职责分离)模式:
CommandHandler 协议
- 目的: 处理改变系统状态的操作(创建、更新、删除等)
- 特点:
- 泛型协议,支持任意命令和结果类型
- 异步处理 (
async def handle)
- 使用 Python 的 Protocol 和 Generic 实现类型安全
QueryHandler 协议
- 目的: 处理不改变系统状态的操作(查询、搜索等)
- 特点:
- 泛型协议,支持任意查询和结果类型
- 异步处理
- 只读操作,不修改系统状态
2. 异常定义 (exceptions.py)
创建了统一的应用层异常层次结构:
ApplicationException (基类)
- 所有应用层异常的基类
- 包含
message 和 details 属性
- 提供
__str__ 和 __repr__ 方法
- 支持详细的错误信息传递
ResourceNotFoundException
- 继承自 ApplicationException
- 用于资源不存在的场景
- 包含
resource_type 和 resource_id 属性
- 自动生成格式化的错误消息
- 通常映射到 HTTP 404 响应
ValidationException
- 继承自 ApplicationException
- 用于输入验证失败的场景
- 包含可选的
field 和 reason 属性
- 支持单个和多个验证错误
- 通常映射到 HTTP 422 响应
3. 模块导出 (init.py)
更新了 __init__.py 文件,导出所有公共接口:
- CommandHandler
- QueryHandler
- ApplicationException
- ResourceNotFoundException
- ValidationException
4. 单元测试
创建了完整的单元测试套件:
test_exceptions.py (18 个测试)
TestApplicationException: 6 个测试
- 测试异常创建、属性、字符串表示
- 测试异常继承关系
- 测试异常抛出和捕获
TestResourceNotFoundException: 5 个测试
- 测试资源类型和 ID 的设置
- 测试详细信息的自动填充
- 测试消息格式
- 测试继承关系
TestValidationException: 7 个测试
- 测试不同参数组合的创建
- 测试字段和原因的设置
- 测试多个验证错误的支持
- 测试继承关系
test_interfaces.py (12 个测试)
TestCommandHandlerProtocol: 4 个测试
- 测试具体实现符合协议
- 测试协议类型提示
- 测试不同返回类型
TestQueryHandlerProtocol: 5 个测试
- 测试具体实现符合协议
- 测试空结果处理
- 测试不同返回类型(列表、字典)
TestProtocolTypeHints: 3 个测试
测试结果: 所有 30 个测试全部通过 ✅
5. 文档
创建了详细的 README.md 文档,包含:
- 模块概述
- 组件详细说明
- 设计原则(CQRS、异常层次结构、依赖方向)
- 使用指南和代码示例
- 测试说明
- 相关需求引用
设计亮点
1. 类型安全
- 使用 Python 的 Protocol 和 Generic 实现类型安全的接口
- 支持静态类型检查(mypy)
- 提供清晰的类型提示
2. CQRS 模式
- 明确分离命令(写操作)和查询(读操作)
- 提高代码的可读性和可维护性
- 便于实现不同的优化策略
3. 异常设计
- 统一的异常基类,便于统一处理
- 详细的错误信息(details 字典)
- 特定异常类型提供类型安全的属性
- 易于序列化为 JSON,适合 API 响应
4. 依赖倒置
- 使用协议而非具体类
- 应用层不依赖基础设施层
- 便于测试和替换实现
5. 完整的测试覆盖
- 30 个单元测试,覆盖所有功能
- 测试正常路径和异常路径
- 测试类型提示和协议实现
文件清单
源代码
src/application/shared/interfaces.py - 协议接口定义
src/application/shared/exceptions.py - 异常类定义
src/application/shared/__init__.py - 模块导出
src/application/shared/README.md - 模块文档
测试代码
tests/unit/application/shared/__init__.py - 测试模块初始化
tests/unit/application/shared/test_exceptions.py - 异常测试
tests/unit/application/shared/test_interfaces.py - 接口测试
验证结果
测试执行
pytest tests/unit/application/shared/ -v
结果: 30 passed in 0.38s ✅
导入验证
from src.application.shared import (
CommandHandler,
QueryHandler,
ApplicationException,
ResourceNotFoundException,
ValidationException
)
结果: All imports successful! ✅
功能验证
e = ApplicationException('test', {'key': 'value'})
print(f'Message: {e.message}')
print(f'Details: {e.details}')
print(f'String: {str(e)}')
结果: 正常输出,功能正确 ✅
符合需求
Requirement 1.4: 应用层协调领域对象完成用例
✅ 定义了 CommandHandler 和 QueryHandler 协议,为应用层提供统一的处理器接口
Requirement 6.1: 统一的异常层次结构
✅ 创建了 ApplicationException 基类和两个具体异常类,建立了清晰的异常层次结构
后续任务
本任务完成后,可以继续执行以下任务:
- Task 5.2: 实现向量搜索命令和查询
- Task 5.3: 实现向量搜索 DTO
- Task 5.4: 实现向量搜索命令处理器
- Task 5.6: 实现向量搜索查询处理器
这些任务将使用本任务创建的接口和异常类。
总结
Task 5.1 已成功完成,创建了应用层的共享概念,包括:
- ✅ 2 个协议接口(CommandHandler, QueryHandler)
- ✅ 3 个异常类(ApplicationException, ResourceNotFoundException, ValidationException)
- ✅ 30 个单元测试,全部通过
- ✅ 完整的文档和使用示例
- ✅ 符合所有相关需求(1.4, 6.1)
代码质量高,测试覆盖完整,文档详细,为后续的应用层开发奠定了坚实的基础。