6.0 KiB
6.0 KiB
Technical Assumptions
Repository Structure: Monorepo
决策: 采用 Monorepo 结构,所有代码在单一 Git 仓库中管理
目录结构:
D:\32_avalonia.ui/
├── src/
│ ├── Penguin.AvaloniaUI/ # 核心控件库项目
│ ├── Penguin.AvaloniaUI.SourceGenerators/ # Source Generator(可选,Post-MVP)
│ ├── Example/ # 示例应用项目
│ └── Penguin.AvaloniaUI.Tests/ # 单元测试项目
├── docs/ # 文档
└── .bmad-core/ # BMAD 框架配置
Rationale:
- Monorepo 简化了控件库和示例应用的协同开发,便于快速迭代和测试
- 依赖管理更简单,所有项目共享同一个 NuGet 依赖版本
- MVP 阶段项目数量少(3-4 个),Monorepo 不会带来复杂度负担
- 未来如果需要拆分(如 Source Generator 独立发布),迁移成本也可控
Service Architecture
架构类型: 单体库(Monolithic Library)
说明:
- Penguin.AvaloniaUI 是一个单一的 .NET 类库项目,所有控件作为命名空间组织在同一个程序集中
- 不采用微服务或独立的控件包(如每个控件一个 NuGet 包),避免过度设计和版本管理复杂度
- 控件之间可以有依赖关系(如 UserGuide 依赖 Overlay),但应尽量保持松耦合
- 使用命名空间隔离不同功能模块:
Penguin.AvaloniaUI.Controls- 业务场景控件Penguin.AvaloniaUI.Layouts- 布局控件Penguin.AvaloniaUI.Themes- 主题和样式Penguin.AvaloniaUI.Utils- 工具类
架构约束:
- 所有控件必须继承自 Avalonia 的标准控件基类(
TemplatedControl、UserControl等) - 样式和模板通过 Avalonia 的资源字典(ResourceDictionary)组织
- 主题切换通过
Application.Current.Resources动态加载不同的资源字典实现
Testing Requirements
测试策略: 单元测试 + 手动集成测试
单元测试范围:
- 核心业务逻辑:PropertyGrid 的属性解析、UserGuide 的步骤流转逻辑
- 工具类:ThemeManager、LocalizationManager(如果实现)等
- 数据绑定和验证:PropertyGrid 的数据模型和 ReactiveUI 集成
不包括的测试:
- UI 渲染测试(Avalonia 的渲染层不易测试,依赖手动验证)
- 跨平台兼容性测试(MVP 阶段只在 Windows 上测试)
- 性能基准测试(除非发现明显的性能问题)
手动测试:
- 使用 Example 项目作为主要测试载体
- 每个控件应在 Example 中有独立的演示页面
- 测试场景包括:主题切换、属性编辑、引导流程、异常处理
测试框架:
- xUnit 作为单元测试框架
- FluentAssertions 用于断言(可选)
- 不引入 UI 自动化测试框架(如 Appium)
Rationale:
- MVP 阶段时间紧张,优先保证核心逻辑的正确性,UI 渲染依赖手动测试
- 上位机和 AI 桌面应用通常不需要极高的测试覆盖率(不像 Web 应用需要应对大规模用户)
- Example 项目本身就是"活文档",可以作为回归测试的基准
Additional Technical Assumptions and Requests
1. 核心技术栈:
- .NET 版本: .NET 8.0 或更高(LTS 版本)
- Avalonia 版本: 11.x(最新稳定版),锁定到次要版本(如 11.0.x)
- ReactiveUI 版本: 最新稳定版(19.x 或更高)
- Semi.Avalonia 版本: 最新稳定版(需要在项目初期快速评估其可用性)
2. AOT 支持策略(软约束):
- 架构设计应考虑未来 AOT 支持,但 MVP 阶段允许使用反射
- PropertyGrid 如果使用反射实现,应设计清晰的抽象层,便于后续迁移到 Source Generator
- 避免使用
Reflection.Emit和动态类型(dynamic) - 尽量使用编译时类型安全的 API
3. 国际化架构预留:
- 控件内置文本(如 PropertyGrid 的"名称"、"值"列头,UserGuide 的"下一步"按钮)应通过资源系统管理,而非硬编码
- MVP 阶段可以使用单一语言(中文或英文),但代码结构应支持后续扩展为多语言
- 推荐方案:使用 Avalonia 的本地化机制(
IResourceProvider)或自定义LocalizationManager
4. 依赖管理原则:
- 最小化第三方依赖:除了 Avalonia、ReactiveUI、Semi.Avalonia 外,尽量不引入其他 NuGet 包
- 锁定主要依赖版本:Avalonia 和 ReactiveUI 的主版本号应固定,避免自动升级导致 Breaking Changes
- Semi.Avalonia 的可选性:如果评估后发现 Semi.Avalonia 不可用或过于复杂,允许放弃使用,改为自定义样式系统(风险缓解措施)
5. 开发工具和环境:
- IDE: Visual Studio 2022 或 Rider
- 版本控制: Git,托管在本地或私有仓库
- 持续集成(可选): MVP 阶段不强制要求 CI/CD,手动构建和测试即可
- 代码格式化: 使用
.editorconfig统一代码风格
6. 性能优化原则:
- 过早优化是万恶之源:MVP 阶段优先功能完整性,性能问题在出现时再优化
- 已知的性能需求:PropertyGrid 对 50 个属性的生成时间 < 200ms,主题切换 < 100ms(见 NFR)
- 虚拟化和懒加载:如果 PropertyGrid 需要支持数百个属性,考虑使用
VirtualizingStackPanel(Post-MVP)
7. 文档和注释规范:
- 所有公开 API(public class、public method)必须有 XML 文档注释
- 复杂的业务逻辑应有内联注释解释设计意图
- README 应包括:快速开始、控件列表、使用示例、常见问题
8. 颜色系统和字体配置:
- 苹果颜色系统的具体实现细节(颜色值、命名规范)将在架构和开发阶段由 UX Expert 确定,PRD 只明确方向
- 字体配置的具体 fallback 策略将在实现时补充,PRD 只定义目标字体族