1. 类的基础定位与设计模式
AutoUpdater 是一个静态类 ,属于 AutoUpdater.NET 库的核心,用于为 .NET 应用提供自动更新能力。
- 设计模式:采用单例思想(静态类实现) + 事件驱动模式,核心逻辑封装在内部方法,对外暴露简洁的配置项和启动方法,符合 "高内聚、低耦合" 的封装原则。
- 适用场景:支持 WinForms/WPF 应用(自动识别应用类型),兼容 HTTP/FTP 协议的更新包下载,支持强制更新、跳过更新、稍后提醒等常见更新场景。
2. 核心封装结构拆解
(1) 对外暴露的配置项(静态字段)
这些字段是开发者使用该类的核心入口,封装了更新所需的所有可配置参数,无需关心内部实现,只需设置参数即可:
|------------------------------------------|----------------------------|------------------------------------|
| 核心配置项 | 作用 | 封装意义 |
| AppCastURL | 更新描述 XML 文件的 URL(HTTP/FTP) | 抽象更新源,开发者只需提供 XML 地址,内部处理下载 / 解析逻辑 |
| InstalledVersion | 当前应用版本(可选,默认从程序集读取) | 解耦版本获取方式,支持自定义版本规则 |
| DownloadPath | 更新包下载路径(默认临时目录) | 灵活配置存储位置,适配不同权限 / 路径需求 |
| Mandatory | 是否强制更新 | 封装强制更新逻辑,自动隐藏 "跳过 / 稍后" 按钮 |
| ShowSkipButton/ShowRemindLaterButton | 是否显示跳过 / 稍后按钮 | 封装 UI 交互逻辑,无需开发者手动控制按钮显隐 |
| Proxy | 网络代理 | 封装网络请求的代理配置,适配企业内网场景 |
| PersistenceProvider | 持久化存储提供者(默认注册表) | 抽象存储层,支持自定义存储(如文件 / 数据库),而非固定注册表 |
(2) 核心方法封装(对外暴露 + 内部实现)
该类的方法分为「对外 API」和「内部辅助方法」,对外只暴露极简的启动 / 下载方法,核心逻辑全部封装在内部:
① 对外暴露的核心方法
|---------------------------------------------------------------------------------------------|---------------------|-----------------------------------------------------------------------------------|
| 方法 | 作用 | 封装细节 |
| Start()/Start(string appCast)/Start(string appCast, NetworkCredential ftpCredentials) | 启动更新检查(支持重载,适配不同场景) | 1. 自动识别应用类型(WinForms/WPF)2. 处理同步 / 异步检查(Synchronous 配置)3. 封装网络协议(HTTP/FTP)的统一处理 |
| DownloadUpdate(UpdateInfoEventArgs args) | 手动触发更新包下载 | 封装下载窗口、进度条、权限处理(管理员运行) |
| ShowUpdateForm(UpdateInfoEventArgs args) | 显示更新提示窗口 | 封装 UI 渲染逻辑,自动适配配置的窗口大小、按钮显隐 |
② 内部核心方法(封装的核心逻辑)
这些方法是类的 "灵魂",对外不可见,封装了更新的核心流程:
|---------------------------------------------|------------|---------------------------------------------------------------------------------------------------------------------------------------|
| 内部方法 | 作用 | 封装亮点 |
| CheckUpdate(Assembly mainAssembly) | 核心更新检查逻辑 | 1. 下载 XML 文件 → 解析为 UpdateInfoEventArgs2. 版本对比(当前版本 vs XML 中的最新版本)3. 处理 "跳过 / 稍后" 的持久化判断(读取注册表 / 自定义存储)4. 强制更新的规则校验 |
| StartUpdate(object result) | 处理更新检查结果 | 1. 分支逻辑: - 若 "稍后提醒" 未到期 → 启动定时器 - 若有更新 → 触发事件 / 显示更新窗口 - 若强制更新 → 自动下载并退出应用2. 线程适配:STA 线程(UI 线程)处理窗口显示,避免跨线程异常 |
| Exit() | 退出应用(含多实例) | 封装应用退出逻辑:1. 关闭当前应用的所有实例(通过进程名 + 主模块路径匹配)2. 兼容 WinForms(Application.Exit)/WPF(Application.Current.Shutdown)3. 触发退出事件,支持开发者自定义退出前逻辑 |
| GetWebClient(Uri uri, IAuthentication auth) | 创建网络请求客户端 | 封装网络请求的统一配置:1. 禁用缓存(NoCacheNoStore)2. 自动适配 HTTP(BasicAuth)/FTP(NetworkCredential)认证3. 设置 UserAgent、代理等参数 |
(3) 事件机制封装(解耦业务逻辑)
该类通过事件(Delegate + Event)封装了 "更新检查完成""应用退出" 等关键节点,让开发者可以自定义业务逻辑,而无需修改类内部代码:
|----------------------|----------|--------------------------------------------|
| 事件 | 作用 | 封装意义 |
| CheckForUpdateEvent | 更新检查完成事件 | 解析 XML 后触发,开发者可自定义更新提示逻辑(而非使用默认窗口) |
| ApplicationExitEvent | 应用退出事件 | 退出前触发,支持开发者执行资源释放、数据保存等操作 |
| ParseUpdateInfoEvent | XML 解析事件 | 自定义 XML 解析逻辑(默认用 XmlSerializer 解析,可通过事件覆盖) |
3. 核心工作流程(封装的执行逻辑)
通过 Start() 方法启动后,内部执行流程如下(封装为闭环,开发者无需干预):
cs
graph TD
A[Start()启动] --> B[初始化:识别应用类型/设置TLS协议]
B --> C{同步/异步?}
C -->|同步| D[CheckUpdate()检查更新]
C -->|异步| E[BackgroundWorker执行CheckUpdate()]
D & E --> F[解析XML为UpdateInfoEventArgs]
F --> G{版本对比:有更新?}
G -->|无| H[触发CheckForUpdateEvent/提示无更新]
G -->|有| I{强制更新?}
I -->|是| J[自动下载更新包→Exit()退出应用]
I -->|否| K{跳过/稍后提醒未到期?}
K -->|是| L[启动稍后提醒定时器]
K -->|否| M[显示更新窗口/触发CheckForUpdateEvent]
4. 关键封装细节
- 跨线程 UI 处理 :更新窗口必须在 STA 线程显示,内部自动判断当前线程模型,若不是 STA 则创建新线程并设置
ApartmentState.STA,封装了 WinForms/WPF 的 UI 线程限制。 - 网络请求封装 :自定义
MyWebClient(内部类)封装 HTTP/FTP 的认证、代理、缓存策略,对外只暴露Proxy/BasicAuthXML等配置项。 - 持久化封装 :默认使用注册表存储 "跳过的版本""稍后提醒时间",但通过
IPersistenceProvider接口抽象,开发者可自定义存储方式(如写入配置文件),符合 "依赖倒置原则"。 - 异常封装 :内部捕获网络异常、XML 解析异常等,通过
ReportErrors配置是否显示错误提示,或通过CheckForUpdateEvent传递异常,避免应用崩溃。
使用示例(理解封装的实际价值)
开发者无需关心内部的线程、网络、UI 逻辑,只需几行代码即可实现自动更新,这就是封装的核心价值:
cs
using AutoUpdaterDotNET;
// 1. 配置更新参数(只需要设置对外暴露的字段)
AutoUpdater.AppCastURL = "https://your-server.com/update.xml"; // 更新XML地址
AutoUpdater.Mandatory = false; // 非强制更新
AutoUpdater.ShowSkipButton = true; // 显示跳过按钮
AutoUpdater.RemindLaterAt = 1; // 稍后提醒间隔1天
AutoUpdater.ReportErrors = true; // 显示错误提示
// 2. 可选:自定义更新检查事件(覆盖默认UI)
AutoUpdater.CheckForUpdateEvent += (args) =>
{
if (args.IsUpdateAvailable)
{
// 自定义更新提示逻辑
if (MessageBox.Show($"发现新版本:{args.CurrentVersion},是否更新?", "更新提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
AutoUpdater.DownloadUpdate(args); // 触发下载
}
}
};
// 3. 启动更新检查(内部自动处理所有逻辑)
AutoUpdater.Start();
总结
- 封装核心思想 :
AutoUpdater采用 "静态类 + 事件驱动" 封装,对外暴露极简的配置项和启动方法,内部封装了网络请求、XML 解析、版本对比、UI 交互、进程管理等复杂逻辑,开发者无需关心底层实现,只需配置参数即可快速集成自动更新功能。 - 关键设计亮点 :
- 抽象层设计:
IPersistenceProvider(存储)、IAuthentication(认证)等接口解耦具体实现,支持自定义扩展; - 场景适配:自动识别 WinForms/WPF、HTTP/FTP,兼容同步 / 异步检查,覆盖强制更新、跳过、稍后提醒等全场景;
- 异常处理:内部捕获关键异常,通过配置 / 事件可控输出,保证应用稳定性。
- 抽象层设计:
- 使用核心:只需关注「配置项设置」和「事件自定义」,核心流程由类内部自动处理,符合 "封装变化、暴露不变" 的面向对象设计原则。