问题描述
为了允许开发人员把他们自己下载器实现嵌入Updater Application Block,DownloaderManager类中的用于定义下载器类型的公共接口必须暴露给开发人员。
设计目标、问题
1. IDownloader接口的最显著的设计目标是,它必须提供一个方法,该方法能够从一个位置向另一个位置拷贝文件。
2. 为了得到最优的性能和效率,Updater Application Block的开发人员决定提供一个方法,该方法可以完成多个文件的拷贝功能。
3. 为了提供更有效率的下载支持,该接口必须鼓励开发人员通过暴露一种机制实现异步下载动作,该机制可以启动异步下载动作,并获得下载状态。
4. 最后,为了有更好的扩展性,该接口应该允许从应用程序配置文件获得初始化参数,并传给下载器。
解决方案描述
IDownloader接口构成了创建下载器类的基础,它将暴露出以下四个方法:
1. Init —— 用于初始化下载器
2. Download —— 用于下载单个文件
3. BeginDownload —— 用于启动多文件下载任务
4. GetJobStatus —— 用于获得一个异步拷贝动作的状态
具体实现
IDownloader接口位于 Microsoft.ApplicationBlocks.ApplicationUpdater.Interfaces命名空间里,实现如下:
[VB.NET]
[c#]
IDownloader接口显露出来的方法将在下面讨论:
1. Init方法接收一个XmlNode类型的参数,允许开发人员从应用程序配置文件中传递Xml设置信息。
2. Download方法使用同步方式拷贝单个文件。事实上,该方法是用来从服务器端拷贝manifest文件到客户端的。它提供一个TimeSpan参数,允许开发人员指定一次同步下载动作的超时时间。
3. BeginDownload方法用来启动异步多文件的下载任务,它接收两个字符串数组参数,一个是源文件,一个是目的文件,然后返回一个全球唯一标识号[GUID],该号码将被用于识别下载任务。
4. GetJobStatus方法允许开发人员检查异步下载任务的状态。它接收一个GUID,并返回JobStatus枚举值。JobStatus枚举类型在同一个集合中定义:
[VB.NET]
[C#]
注意:IDownloader接口同样派生于IDisposable接口,所以任何下载器类必须实现IDisposable接口,该接口提供一种通用而有效的释放资源的模式。
为了允许开发人员把他们自己下载器实现嵌入Updater Application Block,DownloaderManager类中的用于定义下载器类型的公共接口必须暴露给开发人员。
设计目标、问题
1. IDownloader接口的最显著的设计目标是,它必须提供一个方法,该方法能够从一个位置向另一个位置拷贝文件。
2. 为了得到最优的性能和效率,Updater Application Block的开发人员决定提供一个方法,该方法可以完成多个文件的拷贝功能。
3. 为了提供更有效率的下载支持,该接口必须鼓励开发人员通过暴露一种机制实现异步下载动作,该机制可以启动异步下载动作,并获得下载状态。
4. 最后,为了有更好的扩展性,该接口应该允许从应用程序配置文件获得初始化参数,并传给下载器。
解决方案描述
IDownloader接口构成了创建下载器类的基础,它将暴露出以下四个方法:
1. Init —— 用于初始化下载器
2. Download —— 用于下载单个文件
3. BeginDownload —— 用于启动多文件下载任务
4. GetJobStatus —— 用于获得一个异步拷贝动作的状态
具体实现
IDownloader接口位于 Microsoft.ApplicationBlocks.ApplicationUpdater.Interfaces命名空间里,实现如下:
[VB.NET]
Public
Interface IDownloader
Interface IDownloader
Inherits IDisposable
Sub Init()Sub Init (ByVal config As XmlNode)
Sub Download()Sub Download (ByVal sourceFile As String, ByVal destFile As String, _
ByVal maxTimeWait As TimeSpan)
Function BeginDownload()Function BeginDownload (ByVal sourceFile() As String, ByVal destFile() As String) _
As Guid
Function GetJobStatus()Function GetJobStatus (jobId As Guid) As JobStatus
End Interface
Inherits IDisposable
Sub Init()Sub Init (ByVal config As XmlNode)
Sub Download()Sub Download (ByVal sourceFile As String, ByVal destFile As String, _
ByVal maxTimeWait As TimeSpan)
Function BeginDownload()Function BeginDownload (ByVal sourceFile() As String, ByVal destFile() As String) _
As Guid
Function GetJobStatus()Function GetJobStatus (jobId As Guid) As JobStatus
End Interface
[c#]
public
interface
IDownloader : IDisposable
{
void Init( XmlNode config );
void Download( string sourceFile, string destFile, TimeSpan maxTimeWait );
Guid BeginDownload( string[] sourceFile, string[] destFile );
JobStatus GetJobStatus( Guid jobId );
}
{
void Init( XmlNode config );
void Download( string sourceFile, string destFile, TimeSpan maxTimeWait );
Guid BeginDownload( string[] sourceFile, string[] destFile );
JobStatus GetJobStatus( Guid jobId );
}
IDownloader接口显露出来的方法将在下面讨论:
1. Init方法接收一个XmlNode类型的参数,允许开发人员从应用程序配置文件中传递Xml设置信息。
2. Download方法使用同步方式拷贝单个文件。事实上,该方法是用来从服务器端拷贝manifest文件到客户端的。它提供一个TimeSpan参数,允许开发人员指定一次同步下载动作的超时时间。
3. BeginDownload方法用来启动异步多文件的下载任务,它接收两个字符串数组参数,一个是源文件,一个是目的文件,然后返回一个全球唯一标识号[GUID],该号码将被用于识别下载任务。
4. GetJobStatus方法允许开发人员检查异步下载任务的状态。它接收一个GUID,并返回JobStatus枚举值。JobStatus枚举类型在同一个集合中定义:
[VB.NET]
Public
Enum JobStatus
Enum JobStatus
Ready
Downloading
[Error]
Cancelled
Validating
End Enum
Ready
Downloading
[Error]
Cancelled
Validating
End Enum
public
enum
JobStatus
{
Ready,
Downloading,
Error,
Cancelled,
Validating
}
{
Ready,
Downloading,
Error,
Cancelled,
Validating
}
注意:IDownloader接口同样派生于IDisposable接口,所以任何下载器类必须实现IDisposable接口,该接口提供一种通用而有效的释放资源的模式。