Microsoft Updater Application Block v1.0 - 1.6 后处理器设计
Updater Application Block提供后处理架构,该架构允许开发人员创建在升级成功执行的后处理器。后处理器实现IPostProcessor接口的.Net类,用它执行一次性的安装后任务,例如向注册表写数据、创建消息队列、或者其他任何无法通过简单拷贝应用程序文件完成的任务。
后处理器架构在图1中展示出来。
图1中,展示了下面的后处理步骤:
1. 包含后处理器的集合存储在被下载的文件中,作为升级的一部分。
2. 后处理器的集合、类型、文件名称在manifest中指定。
3. 在验证后,拷贝文件到它们的目标目录,应用程序升级器通过启动调用Call方法启动后处理器。
IPostProcessor接口设计
IPostProcessor接口必须通过所有的定制后处理器实现。下面将讨论IPostProcessor接口的以下几个方面:
问题描述
设计目标、权衡和问题
解决方案描述
具体实现
问题描述
应用程序设计器可以执行开发人员创建的后处理器以便执行指定应用程序的安装后任务,为了实现这一功能,所有的后处理器必须实现一个通用的接口。
设计目标、权衡和问题
Updater Application Block的开发人员识别出以下一些与IPostProcessor接口相关的设计目标、权衡和问题:
1. IPostProcessor接口的主要设计目标是它应该足够简单
2. 主要的权衡涉及简单接口的需求和该接口能够为开发人员提供的用复杂初始化参数创建后处理器的能力。最后,选择了一个简单的方法
3. 如果需要复杂初始化参数,开发人员必须在升级文件中包括初始化文件(如一个包含必要数据的xml文件),并且在后处理器中实现装载和读取文件的代码。
解决方案描述
IPostProcessor接口暴露了一个Run方法。
具体实现
VB.NET
public interface IPostProcessor : IDisposable
{
void Run();
}
C#
Public Interface IPostProcessor
Inherits IDisposable
Sub Run()
End Interface
注意,由于IPostProcessor派生于IDisposable接口,所以开发人员在实现IPostProcessor接口的同时,必须实现IDisposable接口。
你还必须注意到,应用程序升级器在单一的线程上执行后处理器,并且不具有抛出异常或清除使用过的资源的能力。定制的后处理器实现应该确保 Dispose方法在Run方法完成后被调用,或在某次提前的退出后被调用。开发人员还必须确认所有的异常,包括线程中止,都能被处理,如果需要的话,还可以记录下来。
后处理器架构在图1中展示出来。
![](/images/cnblogs_com/tonyqus/updater7.jpg)
图1中,展示了下面的后处理步骤:
1. 包含后处理器的集合存储在被下载的文件中,作为升级的一部分。
2. 后处理器的集合、类型、文件名称在manifest中指定。
3. 在验证后,拷贝文件到它们的目标目录,应用程序升级器通过启动调用Call方法启动后处理器。
IPostProcessor接口设计
IPostProcessor接口必须通过所有的定制后处理器实现。下面将讨论IPostProcessor接口的以下几个方面:
问题描述
设计目标、权衡和问题
解决方案描述
具体实现
问题描述
应用程序设计器可以执行开发人员创建的后处理器以便执行指定应用程序的安装后任务,为了实现这一功能,所有的后处理器必须实现一个通用的接口。
设计目标、权衡和问题
Updater Application Block的开发人员识别出以下一些与IPostProcessor接口相关的设计目标、权衡和问题:
1. IPostProcessor接口的主要设计目标是它应该足够简单
2. 主要的权衡涉及简单接口的需求和该接口能够为开发人员提供的用复杂初始化参数创建后处理器的能力。最后,选择了一个简单的方法
3. 如果需要复杂初始化参数,开发人员必须在升级文件中包括初始化文件(如一个包含必要数据的xml文件),并且在后处理器中实现装载和读取文件的代码。
解决方案描述
IPostProcessor接口暴露了一个Run方法。
具体实现
VB.NET
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
注意,由于IPostProcessor派生于IDisposable接口,所以开发人员在实现IPostProcessor接口的同时,必须实现IDisposable接口。
你还必须注意到,应用程序升级器在单一的线程上执行后处理器,并且不具有抛出异常或清除使用过的资源的能力。定制的后处理器实现应该确保 Dispose方法在Run方法完成后被调用,或在某次提前的退出后被调用。开发人员还必须确认所有的异常,包括线程中止,都能被处理,如果需要的话,还可以记录下来。
版权声明:本文由作者Tony Qu原创, 未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。