当前代码可以跑通最基础下载流程,但整体处于“功能堆叠 + 事件驱动直写”阶段,可维护性与可扩展性较弱。
-
UI 层与业务逻辑强耦合
- 下载逻辑、配置写入、异常处理都放在
*.xaml.cs事件中。 - 导致后续很难做单元测试,也不利于功能复用。
- 下载逻辑、配置写入、异常处理都放在
-
全局静态状态过多
SettingsPage.Settings为静态类,页面状态与全局状态耦合。DownloadsPage.DownloadPath也是静态属性,容易造成隐式共享和线程安全风险。
-
重复代码明显
- 每个下载项都重复
try/catch + DownloadFileWithMultiThread + Growl.Success。 - 维护 URL、文件名和提示语时非常容易漏改。
- 每个下载项都重复
-
容错与校验不足
- 自定义下载未校验 URL 合法性与文件名合法性。
- 下载目录存在性未显式保证。
- 任意异常都直接拼接到 UI 错误提示,用户可读性差。
-
下载生命周期管理缺失
- 创建了
CancellationTokenSource,但没有暴露取消入口和资源释放策略。 - 无“下载中”禁用按钮、无进度展示、无并发策略。
- 创建了
-
配置持久化缺失
- 线程数、路径在运行时内存中可用,但未稳定落盘。
- 重启后设置丢失,影响用户体验。
-
架构层面建议
- 建议转向 MVVM:
- View: XAML 仅声明布局。
- ViewModel: 命令与状态。
- Service: 下载服务、配置服务、通知服务。
- 下载项抽象为配置对象集合(名称、URL、目标文件、描述),循环执行,消除重复。
- 建议转向 MVVM:
- 抽离下载服务和配置服务(先降低耦合)。
- 用下载项模型替换硬编码 if 分支(先去重复)。
- 增加输入校验与统一错误处理(先兜底)。
- 引入可取消与进度反馈(提升体验)。
- 再逐步迁移到 MVVM(中期演进)。
- 建一个
DownloadItem模型:Name、Url、TargetFileName、Selected。 - 按列表过滤
Selected后统一下载;一处处理异常与通知。 - 对
UrlTextBox和ExtraTextBox先做Uri.TryCreate+ 文件名非法字符校验。 - 程序启动时读取配置文件,设置页变更后节流写回。