设置系统实现总结
May 31, 2025 · View on GitHub
概述
成功实现了完整的泛型设置管理系统,参考 Microsoft TemplateStudio 的 WinUI 项目模板设计。系统采用分层架构,Core 项目提供跨平台接口和默认实现,WinUI 项目提供 Windows 平台特有的实现。
已完成的功能
1. 核心接口和模型 (XiaoZhi.Core)
ISettingsService 泛型接口
Task<T> LoadSettingsAsync()- 异步加载设置Task SaveSettingsAsync(T settings)- 异步保存设置Task<bool> ExportSettingsAsync(string filePath, T settings)- 导出设置到文件Task<T?> ImportSettingsAsync(string filePath)- 从文件导入设置Task ResetToDefaultAsync()- 重置为默认设置T GetCurrentSettings()- 获取当前设置(同步方法)event EventHandler<T>? SettingsChanged- 设置变化事件
AppSettings 模型类
包含所有应用设置属性:
- 唤醒词设置: WakeWordEnabled, WakeWords
- 设备设置: DeviceId
- 服务器设置: WsAddress, WsToken
- 音频设置: DefaultVolume, AutoAdjustVolume, AudioInputDevice, AudioOutputDevice
- 应用设置: AutoStart, MinimizeToTray, EnableLogging
- 高级设置: ConnectionTimeout, AudioSampleRate, AudioChannels
包含验证逻辑和默认值设置。
2. 跨平台默认实现 (XiaoZhi.Core)
FileBasedSettingsService
- 基于文件系统的跨平台实现
- 使用 JSON 序列化/反序列化
- 支持自定义配置文件路径
- 包含完整的错误处理和日志记录
3. Windows 平台特有实现 (XiaoZhi.WinUI)
WindowsSettingsService
- 使用 Windows ApplicationData 进行本地存储
- 集成 Windows 文件选择器用于导入/导出
- 支持 WinUI 平台特有的文件操作
- 完整的异常处理和日志记录
4. 依赖注入配置
App.xaml.cs 配置
services.AddSingleton<ISettingsService<AppSettings>, WindowsSettingsService<AppSettings>>();
5. UI 集成 (SettingsPage)
完整的设置页面功能
- 加载设置: 从设置服务加载配置并更新UI
- 保存设置: 收集UI输入并通过设置服务保存
- 导出设置: 使用 Windows 文件选择器导出JSON配置文件
- 导入设置: 从JSON文件导入配置并更新UI
- 重置设置: 恢复所有设置为默认值
- 实时同步: UI控件变化时实时保存到本地设置
错误处理和用户反馈
- 完整的异常处理机制
- 用户友好的错误对话框
- 操作成功确认提示
技术特点
1. 泛型设计
- 使用泛型接口支持任意设置类型
- 类型安全的设置操作
- 可扩展到其他设置类型
2. 平台适配
- Core 项目提供跨平台默认实现
- WinUI 项目提供 Windows 优化实现
- 遵循 .NET 平台最佳实践
3. JSON 序列化
- 人类可读的配置文件格式
- 支持注释和格式化
- 版本兼容性友好
4. 事件驱动
- 设置变化事件通知
- 支持响应式UI更新
- 解耦的组件通信
项目状态
✅ 已完成
- 核心接口和模型定义
- 跨平台默认实现
- Windows 平台特有实现
- 依赖注入配置
- SettingsPage UI 集成
- 错误处理和日志记录
- 项目编译成功
🧪 需要测试
- 设置加载功能 - 验证应用启动时正确加载设置
- 设置保存功能 - 验证UI变化后设置正确保存
- 导出功能 - 测试JSON文件导出和文件选择器
- 导入功能 - 测试从JSON文件导入设置
- 重置功能 - 验证重置到默认值功能
- 错误处理 - 测试各种错误场景的处理
- UI同步 - 验证设置与UI控件的双向绑定
📝 已知问题
- IDE 类型解析 - VS Code 编辑器显示跨项目类型引用错误,但编译成功
- 未使用字段警告 - HomePage 中有未使用的字段警告(与设置系统无关)
使用方法
1. 注入设置服务
private readonly ISettingsService<AppSettings>? _settingsService;
public SettingsPage()
{
_settingsService = App.GetService<ISettingsService<AppSettings>>();
}
2. 加载设置
var settings = await _settingsService.LoadSettingsAsync();
3. 保存设置
await _settingsService.SaveSettingsAsync(settings);
4. 导出设置
var success = await _settingsService.ExportSettingsAsync(filePath, settings);
5. 导入设置
var importedSettings = await _settingsService.ImportSettingsAsync(filePath);
6. 重置设置
await _settingsService.ResetToDefaultAsync();
架构优势
- 模块化设计 - 核心逻辑与平台实现分离
- 可测试性 - 接口驱动设计便于单元测试
- 可扩展性 - 泛型设计支持多种设置类型
- 平台优化 - 每个平台使用最适合的存储机制
- 类型安全 - 编译时类型检查避免运行时错误
下一步计划
- 端到端测试 - 全面测试所有设置功能
- 性能优化 - 优化大型设置文件的处理
- 本地化支持 - 添加多语言错误消息
- 单元测试 - 为所有组件添加单元测试
- 文档完善 - 添加开发者文档和使用示例