optimizerDuck 架构全景图:从 Domain 到 UI 的分层设计
【免费下载链接】optimizerDuckFree, open-source Windows optimization tool for performance, privacy, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/op/optimizerDuck
optimizerDuck 是一款免费开源的 Windows 优化工具,其架构采用清晰的分层设计:Domain 层定义优化项与规则,Services 层负责执行与状态管理,UI 层以 MVVM 呈现交互。本文将带你全景看懂这套 C# WPF 架构的分层设计,理解每层职责与协作方式。
🗺️ 整体架构地图
optimizerDuck 主工程按职责拆分为四大板块,依赖方向严格单向流动:
| 层级 | 目录 | 核心职责 |
|---|---|---|
| 📦 Domain | Domain/ | 优化项、类别、条件、回滚步骤的纯领域模型,不依赖任何 UI |
| ⚙️ Services | Services/ | 服务发现、执行引擎、回滚管理器、系统信息服务 |
| 🖥️ UI | UI/ | WPF 窗口、页面、对话框与 ViewModel(MVVM 模式) |
| 🧩 Common | Common/ | 转换器、扩展方法、反射与 HTTP 等通用工具 |
依赖方向如下:UI → Services → Domain。Domain 层"不认识"UI,Services 层"不认识"页面——这正是它易于测试与维护的关键。
📦 Domain 层:领域模型与核心规则
Domain 层是整个架构的"地基",它定义了什么是优化项、如何判断兼容性、如何记录回滚步骤。
抽象与契约:Domain/Abstractions/
所有核心概念都以接口形式定义:
- IOptimization.cs:单个优化项契约,包含唯一 ID、风险等级、兼容条件与
ApplyAsync应用方法 - IOptimizationCategory.cs:优化类别(性能、隐私、GPU 等 7 大类)
- IRevertStep.cs:可撤销步骤,保证每个变更都"可后悔"
特性驱动:Domain/Attributes/
每个优化类通过自定义特性声明元数据,无需手动注册:
- OptimizationAttribute.cs:声明唯一 ID、风险等级、标签与兼容条件
- OptimizationCategoryAttribute.cs:声明类别名称与排序
这意味着新增一个优化项只需写一个类并挂上特性,框架会通过反射自动发现它。
条件系统:Domain/Conditions/
ConditionBase.cs 提供了兼容条件基类,BuiltIn/ 下内置了 Windows 10/11 版本、CPU/GPU 品牌、最低内存等条件。不满足条件的优化项会在界面中显示为"不支持"而非报错。
执行上下文:Domain/Execution/
ExecutionScope.cs 是一个亮点设计——基于AsyncLocal的环境异步上下文。优化项执行时开启作用域,底层注册表、服务等 Provider 无需任何依赖注入,只需静态调用ExecutionScope.RecordStep()就能把每一步成功/失败与回滚步骤自动记录在案。作用域结束即产出ApplyResult(全部成功 / 部分成功 / 失败)。
回滚数据:Domain/Revert/
RevertData.cs 定义 JSON 持久化结构,Steps/ 下包含注册表、服务、计划任务、Shell 命令四种回滚步骤实现,这是"一键撤销"功能的模型基础。
⚙️ Services 层:编排一切的"指挥家"
Services 层是 Domain 模型的驱动者,核心组件都在启动时注册为单例。
反射发现:OptimizationRegistry
OptimizationRegistry.cs 在启动时后台扫描程序集,通过反射找出所有实现IOptimizationCategory的类型,自动实例化其嵌套的优化项并加载已应用状态——零手动注册。
执行引擎:OptimizationService
OptimizationService.cs 是应用/回滚的中枢:
- 开启
ExecutionScope并调用优化项的ApplyAsync - 底层 Providers/ 中的 RegistryService、ServiceProcessService、ScheduledTaskService、ShellService 分别操作注册表、Windows 服务、计划任务与命令行
- 任何成功的步骤都会经 RevertManager.cs 写入 JSON 回滚文件,支持部分成功与失败步骤重试
状态判断也很"聪明":不建数据库,直接扫描%LocalAppData%\optimizerDuck\Revert\下的 JSON 文件推断哪些优化项已应用。
系统能力:Services/System/
SystemInfoService.cs 提供 CPU/RAM/GPU 硬件快照;RegistryWatcher.cs 监视注册表被外部修改后自动刷新界面;UpdaterService.cs 负责版本更新检查。
🖥️ UI 层:MVVM 与 Fluent 设计
UI 层基于WPF + WPF-UI(Fluent Design),采用社区工具包 CommunityToolkit.Mvvm 实现 MVVM(见 optimizerDuck.csproj 中的依赖声明)。
启动编排:App.xaml.cs
App.xaml.cs 是整条依赖链的组装点:
- 用
Host.CreateDefaultBuilder()构建 DI 容器,Serilog 接管日志 - 批量注册 MainWindow、各页面 ViewModel、单例服务
- 最后触发
OptimizationRegistry.PreloadOptimizationsAsync()完成优化项预热
页面与视图模型
UI/Pages/ 与 UI/ViewModels/ 一一对应:
| 页面 | ViewModel | 功能 |
|---|---|---|
| OptimizePage.xaml | OptimizeViewModel.cs | 按类别浏览并应用优化项 |
| CustomizePage.xaml | CustomizeViewModel.cs | 桌面/偏好/游戏/系统四类定制开关 |
| BloatwarePage.xaml | BloatwareViewModel.cs | 风险徽章标记的 AppX 卸载 |
| DashboardPage.xaml | DashboardViewModel.cs | 硬件信息仪表盘 |
Common/Converters/ 提供了 18 个 XAML 值转换器(风险色、进度条、可见性等),让 XAML 保持声明式简洁。多语言由 Resources/Languages/ 下的 16 种.resx翻译资源驱动。
🧪 分层设计的红利:可测试性
因为 Domain 与 Services 不依赖 WPF,optimizerDuck.Test/ 测试项目可以直接单测核心逻辑,例如 OptimizationServiceTests.cs、RevertStepSerializationTests.cs 和 ConditionTests.cs。主工程还通过InternalsVisibleTo向测试项目开放内部成员——分层越干净,测试越轻松。
✅ 总结
optimizerDuck 的分层架构可以浓缩为一句话:Domain 定义规则,Services 负责执行,UI 只做呈现。
- 新增优化项 = 写一个类 + 挂特性,反射自动发现
- 每个变更自动记录
IRevertStep,一键回滚有据可依 ExecutionScope环境上下文让步骤记录零侵入- 依赖单向流动,测试项目可独立验证核心逻辑
这种设计让一个"改注册表"的系统工具,拥有了媲美企业级应用的工程品质——想深入细节,不妨从 Domain/Abstractions/ 的四个接口读起。
【免费下载链接】optimizerDuckFree, open-source Windows optimization tool for performance, privacy, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/op/optimizerDuck
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考