原文引自:
http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/SCArchDeGuide/Chapter1Introduction.mspx
使用 Offline Application Block 进行开发
发布日期: 8/19/2004 | 更新日期: 8/19/2004
Microsoft Corporation
内容:第 3 章详细说明了构建和使用该应用程序块的过程。本章还提供了快速入门,以帮助您了解实现自己的脱机解决方案所需的步骤。
本页内容
现在您已经了解了 Offline Application Block 的设计,接下来就可以使用该应用程序块开发解决方案了。要开发使用 Offline Application Block 的应用程序,您需要:
• |
了解如何构建(编译)该应用程序块。 |
• |
查看快速入门以学习如何使用该应用程序块。 |
本章为您说明了如何使用 Offline Application Block 以及与该应用程序块随附的不同子系统相关联的提供程序,来开发解决方案。本章还讨论了设计注意事项以及如何开发自己的提供程序。本章使用连接检测提供程序(由该应用程序块提供)作为参考示例。
安装 Offline Application Block
在安装 Offline Application Block 之前,查看软件要求和该应用程序块构建的文件夹结构非常重要。
软件要求
要使用 Offline Application Block,您必须确保系统符合下列最低软件要求:
• |
Microsoft_ Windows_ XP 操作系统 |
• |
Microsoft .NET framework 1.1 版 |
• |
Microsoft Visual Studio_ .NET 2003 开发系统(企业级结构设计版、企业级开发版或 .NET 专业版) |
此外,您可能需要安装 Microsoft Internet 信息服务 (IIS),这取决于应用程序的目的,或是您是否打算安装 InsuranceClaimsService Web 服务,以便在同一计算机上运行 InsuranceClaimsQuickStart\InsuranceClaimsClient。
该应用程序块具有用于“队列存储”的内置提供程序。这些提供程序使用:
除其他提供程序之外,该应用程序块还具有用于缓存的内置提供程序。
注 有关相应队列和缓存提供程序的配置详细信息,请参阅本章结尾的“设置桌面引擎和 MSMQ”部分。
构建 Offline Application Block
您必须先构建解决方案,然后添加对几个程序集的引用,之后才能使用 Offline Application Block。
构建 Offline Application Block
1. |
在 Visual Studio .NET 2003 中打开 Offline.sln 解决方案(位于 <installation location>\Offline\ 文件夹中)。此外,您还可以按以下方式访问 Offline Application Block:依次单击 Start、All Programs、Microsoft Application Blocks for .NET、Offline,然后单击 OfflineApplication Block。 |
2. |
构建解决方案以生成下列程序集:
• |
Microsoft.ApplicationBlocks.SmartClient.Offline.dll |
• |
Microsoft.ApplicationBlocks.SmartClient.Offline.Providers.dll |
• |
MemoryMappedFileStream.dll |
• |
Microsoft.ApplicationBlocks.Cache.dll |
• |
Microsoft.ApplicationBlocks.Common.dll |
• |
Microsoft.ApplicationBlocks.Data.dll |
• |
Microsoft.ApplicationBlocks.ExceptionManagement.dll |
• |
Microsoft.ApplicationBlocks.ExceptionManagement.Interfaces.dll | |
要在应用程序中使用 Offline Application Block,您需要添加一个对 Common、Offline Providers 和 Offline 程序集的引用。如果您使用的是 Visual C#,请将 using 指令添加到要访问块代码的文件中。如果您使用的是 Visual Basic .NET,请将 Imports 指令添加到您要在其中访问块代码的文件中。例如,如果您使用 Visual C# 编写一个新的服务代理,请将以下 using 指令添加到要访问块代码的文件中:
...
using Microsoft.ApplicationBlocks.SmartClient.Offline;
...
在 Visual Basic 中使用的相应 Imports 指令是:
...
Imports Microsoft.ApplicationBlocks.SmartClient.Offline
...
Offline Application Block 文件夹结构
当您安装 Offline Application Block 时,安装程序包将创建以下文件夹结构:
<Install Location>
+---Offline
+---Caching
: +---src
: +---cs
: +---Cache
: : +---DataProtectionImplementations
: : +---ExpirationsImplementations
: : +---ScavengingImplementations
: : +---StorageImplementations
: +---MemoryMappedFile
+---Common
: +---src
: +---cs
: +---Common
: : +---Crypto
: : : +---doc
: : +---doc
: +---Version
+---DAAB
: +---src
: +---cs
: +---Microsoft.ApplicationBlocks.Data
+---Database
: +---Cache
: +---Queue
+---Docs
+---EMAB
: +---src
: +---cs
: +---Microsoft.ApplicationBlocks.ExceptionManagement
: +---Microsoft.ApplicationBlocks.ExceptionManagement.Interfaces
+---QuickStarts
: +---src
: : +---cs
: : : +---ConnectionManagementQuickStart
: : : +---DownloadQuickStart
: : : +---InsuranceClaimsQuickStart
: : : : +---Database
: : : : +---InsuranceClaimsClient
: : : : +---InsuranceClaimsService
: : : +---UploadQuickStart
: : +---vb
: : +---ConnectionManagementQuickStart
: : +---DownloadQuickStart
: : +---InsuranceClaimsQuickStart
: : : +---Database
: : : +---InsuranceClaimsClient
: : : +---InsuranceClaimsService
: : +---UploadQuickStart
: +---Utility
: +---ValidationKeyGeneration
+---src
+---cs
+---Offline
: +---Builders
: +---ConnectionManagement
: +---DataLoadingManagement
: +---Executor
: +---QueueManagement
: +---ReferenceDataManagement
: +---ServiceAgentManagement
+---Offline Providers
: +---CacheStorageProviders
: +---ConnectionDetectionStrategies
: +---QueueStorageProviders
+---Versioning
每个快速入门解决方案都构建在各自的子文件夹中。表 3.1 说明了在安装 Offline Application Block 时安装程序包所创建的文件夹。
表 3.1:Offline Application Block 安装程序包创建的文件夹
<installation location> |
安装 Offline Application Block 的文件夹。默认安装文件夹是: C:\Program Files\Microsoft Application Blocks for .NET\SmartClient Offline Application Block\ |
Bin |
存储在为该应用程序块生成源代码时所生成的所有二进制文件。该文件夹包含 Debug 或 Release 文件夹,它们包含二进制文件。 |
Docs |
包含与该应用程序块有关的文档,其中包括编译的帮助 (.chm) 文件。 |
Database |
包含设置“桌面引擎”数据库(该数据库由“桌面引擎”队列和缓存存储提供程序使用)所需的数据库脚本。 |
QuickStarts |
包含所有快速入门。对于 Microsoft Visual C#_ 开发工具和 Microsoft Visual Basic_ .NET 开发系统,每个快速入门都有不同的版本。快速入门是独立的文档,并包含相关的解决方案文件。在构建快速入门时,系统会在 QuickStart 文件夹下创建一个 bin 文件夹。bin 文件夹包含存有二进制文件的 Debug 文件夹或 Release 文件夹。每个快速入门都有一个独立的 bin 文件夹。 |
Src |
包含 Offline Application Block 的源代码。src 文件夹包含下列文件夹:
Offline – 包含对于 Offline Application Block 非常重要的代码。
Providers – 包含特定于该应用程序块所提供的提供程序的源代码。 |
Offline Application Block 快速入门
要将脱机功能添加到应用程序中,请先查看该应用程序块随附的四个快速入门:
• |
连接管理快速入门说明如何使用该应用程序块的“连接状态管理”子系统组件,来检测应用程序是处于联机状态还是脱机状态,以及强制系统脱机或联机。 |
• |
下载快速入门说明如何下载参考数据,这样即使在应用程序脱机时用户也可以继续使用应用程序。该快速入门使用 OnlineProxy 类从一个虚拟服务(为进行说明而使用的本地方法调用)检索数据,并使用“参考数据管理”子系统将该数据存储在“参考数据缓存”中。 |
• |
上载快速入门说明当应用程序的用户在客户端上更新某些信息后,如何将数据上载到服务器。该快速入门说明了如何使用该应用程序块的“消息数据管理”子系统。在处理这些消息之前,使用队列来存储它们。 |
• |
保险理赔快速入门说明了一个使用 Web 服务的端到端应用程序。它是最高级的快速入门,说明了如何将该应用程序块用于与 Web 服务进行交互的应用程序。该快速入门随附的脚本可以创建和删除 IIS 中的虚拟目录。该快速入门包含一个使用该应用程序块所有子系统的智能客户端应用程序。这些子系统包括:服务代理管理、连接状态管理、消息数据管理和参考数据管理。它还演示了对该应用程序块所引发的异常的基本错误处理。 |
您可以使用这些快速入门来更好地理解 Offline Application Block、开发新的提供程序或修改现有的提供程序。例如,您可能要为连接检测功能开发几个提供程序,但在配置文件中只启用所需的提供程序。
要点 这些快速入门旨在帮助您理解该应用程序块;它们不是现成的产品代码示例。
下面的段落将在开发人员要在应用程序中执行的任务的上下文中讨论每个快速入门。
管理应用程序的连接状态
“连接管理快速入门”说明如何使用该应用程序块的“连接状态管理”子系统组件,来检测应用程序是处于联机状态还是脱机状态,以及强制改变应用程序的状态。
该快速入门的单屏幕中包含两个按钮 — Go Offline 和 Go Online,可让用户将应用程序的状态更改为联机或脱机。该屏幕还有一个标签,用来显示应用程序的连接状态。
当该快速入门运行时,应用程序块开始在后台轮询连接,以自动检测连接状态更改。如果连接状态随后被强制为脱机,则轮询会立即停止。该快速入门注册了 ConnectionManager 类的 ConnectionStateChangedEvent。注册该事件可让快速入门对连接状态的更改做出反应。当连接状态更改时,会引发该事件,并且屏幕上的连接状态标签会发生更改,以反映应用程序的连接状态。
构建连接管理快速入门
1. |
在 Visual Studio .NET 2003 中打开 ConnectionManagementQuickStart.sln 解决方案(位于 <installation location>\Offline\QuickStarts\src\<language>\ConnectionManagementQuickStart\ 文件夹中)。此外,您还可以按以下方式访问“连接管理快速入门”:依次单击 Start、All Programs、MicrosoftApplicationBlocks for .NET、Offline、QuickStartSamples (C#) / (VB),然后单击 ConnectionManagementQuickStart。 |
2. |
构建解决方案。这将在 <installation location>\Offline\QuickStarts\src\<language>\ConnectionManagementQuickStart\ 文件夹下的 bin\<build configuration> 文件夹中生成 ConnectionManagementQuickstart.exe 程序集。 |
要启动该快速入门,请双击 ConnectionManagerQuickStart.exe。
“连接管理快速入门”文件
这些快速入门文件位于 <installation location>\Offline\QuickStarts\src\<language>\ConnectionManagementQuickStart\ 文件夹中。表 3.2 说明了与该“连接管理快速入门”讨论相关的文件。
表 3.2:“连接管理快速入门”文件
App.config |
指定应用程序的配置信息。 |
ConnectionManagementForm.cs \ .vb |
对应于应用程序的视图 (UI)。 |
ConnectionManagementQuickStart.sln |
“连接管理快速入门”的解决方案文件。 |
Controller.cs \ .vb |
管理 UI 与连接管理器和服务代理之间的交互。它还注册了连接状态更改事件,并通过将更改传递到关联视图的方式来响应更改。 |
详细信息
该快速入门使用了该应用程序块随附的默认连接检测提供程序(策略)。该默认连接检测提供程序使用 WinInet 动态链接库 (DLL) 的 InternetGetConnectedState 方法来检测连接状态更改。例如,如果在运行该示例时,将网络电缆从连接到网络的计算机中拔出,则连接状态将显示更改为脱机模式。
检测连接的提供程序是在应用程序配置文件中指定的。有关在配置文件中指定提供程序的详细信息,请参阅第 4 章“Offline Application Block 配置和安全注意事项”。
传输中的数据:下载
“下载快速入门”说明如何下载参考数据,以便应用程序的用户即使在应用程序脱机时也可以继续使用该应用程序。
该快速入门的单屏幕中包含一个 Download 按钮和一个用来显示结果的网格。当用户单击 Download 按钮时,数据开始下载(从本地的 XML 文件读取)并显示在网络中。
构建下载快速入门
1. |
在 Visual Studio .NET 2003 中打开 DownloadQuickStart.sln 解决方案(位于 <installation location>\Offline\QuickStarts\src\<language>\DownloadQuickStart\ 文件夹中)。此外,您还可以按以下方式访问“下载快速入门”:依次单击 Start、All Programs、MicrosoftApplication Blocks for .NET、Offline、Quick Start Samples (C#) / (VB),然后单击 DownloadQuickStart。 |
2. |
构建解决方案。这将在 <installation location>\Offline\QuickStarts\src\<language>\DownloadQuickStart\ 文件夹下的 bin\<build configuration> 文件夹中生成 DownloadQuickstart.exe 程序集。 |
要启动该快速入门,请双击 DownloadQuickStart.exe。
“下载快速入门”文件
这些快速入门文件位于 <installation location>\Offline\QuickStarts\src\<language>\DownloadQuickStart\ 文件夹中。表 3.3 说明了与该“下载快速入门”讨论相关的文件。
表 3.3:“下载快速入门”文件
App.config |
指定应用程序的配置信息。 |
DownloadQuickStartForm.cs \ .vb |
对应于应用程序的视图 (UI)。 |
DownloadQuickStart.sln |
“下载快速入门”的解决方案文件。 |
Controller.cs \ .vb |
管理 UI 与连接管理器和服务代理之间的交互。它可以注册连接状态更改事件、创建 DownloadDataServiceAgent 并使用其进行注册、启动下载,以及在数据可用时使用结果来更新视图。 |
DownloadDataServiceAgent.cs \ .vb |
为用于下载工作项目的 OnlineProxy 和服务代理填充必要的上下文信息。它通过调用 DataLoaderManager 来启动下载工作项目,并将结果返回到控制器。 |
OnlineProxy.cs \ .vb |
与远程服务进行交互;在这种情况下,它是用于下载数据的本地文件。 |
DataSimulator.xml |
存储联机代理用于返回数据的虚拟数据。 |
详细信息
该快速入门使用服务代理(DownloadDataServiceAgent)来启动下载。DownloadDataServiceAgent 负责使用必要的上下文信息创建正确的 ReferenceDataDefinition,例如使用 OnlineProxyContext 创建 OnlineProxy 类以便从虚拟服务(为进行说明而使用的一个本地方法调用)中检索数据,以及使用 ServiceAgentContext 将结果返回到控制器。该服务代理调用 DataLoaderManager 来启动下载具有正确 ReferenceDataDefinition 值的参考数据。
OnlineProxy 负责检索数据,然后使用“参考数据管理”子系统将该数据存储在“参考数据缓存”中。
默认情况下,该快速入门使用 InMemoryQueueStorageProvider 来缓存数据。用于缓存的提供程序是在应用程序的配置文件中指定的。有关如何在配置文件中指定提供程序的详细信息,请参阅第 4 章“Offline Application Block 配置和安全注意事项”。
传输中的数据:上载
“上载快速入门”说明如何将应用程序用户修改后的数据上载到服务器。该快速入门说明了如何使用该应用程序块的“消息数据管理”子系统。
该快速入门的基本窗体包含几个字段、一个 Save 按钮和一个 Cancel 按钮。当该快速入门启动时,它会读取包含数据的本地 XML 文件,并在窗体中显示数据。当用户修改数据并单击 Save 按钮后,该数据会保存到本地 XML 文件中。这模拟了使用与远程服务进行通信时所必需的所有组件。
构建上载快速入门
1. |
在 Visual Studio .NET 2003 中打开 UploadQuickStart.sln 解决方案(位于 <installation location>\Offline\QuickStarts\src\<language>\UploadQuickStart\ 文件夹中)。此外,您还可以按以下方式访问“上载快速入门”:依次单击 Start、All Programs、Microsoft Application Blocks for .NET、Offline、Quick Start Samples (C#) / (VB),然后单击 Upload Quick Start。 |
2. |
构建解决方案。这将在 <installation location>\Offline\QuickStarts\src\<language>\UploadQuickStart\ 文件夹下的 bin\<build configuration> 文件夹中生成 UploadQuickstart.exe 程序集。 |
要启动该快速入门,请双击 UploadQuickStart.exe。
“上载快速入门”文件
该快速入门文件位于 <installation location>\Offline\QuickStarts\src\<language>\UploadQuickStart\ 文件夹中。表 3.4 说明了与该“上载快速入门”讨论相关的文件。
表 3.4:“上载快速入门”文件
App.config |
指定应用程序的配置信息。 |
UploadQuickStartForm.cs \ .vb |
对应于应用程序的视图 (UI)。 |
UploadQuickStart.sln |
“上载快速入门”的解决方案文件。 |
Controller.cs \ .vb |
管理 UI 与连接管理器和服务代理之间的交互。它可以注册连接状态更改事件、创建 UploadDataServiceAgent 并使用其进行注册,以及启动上载。 |
UploadDataServiceAgent.cs \ .vb |
创建 Payload 并为用于上载工作项目的 OnlineProxy 和服务代理填充必要的上下文信息。它通过调用 QueueManager 来启动上载工作项目信息,并将结果返回到控制器(如果需要)。 |
OnlineProxy.cs \ .vb |
与远程服务进行交互。在这种情况下,它是用于上载数据的本地文件。 |
DataSimulator.xml |
存储由联机代理使用的虚拟数据。 |
详细信息
该快速入门说明了“消息数据管理”子系统是如何工作的。当该快速入门启动时,它从本地 XML 文件中读取数据,并将数据显示在窗体中。在用户修改数据后单击 Save 按钮时,控制器将调用 UploadDataServiceAgent 对象的 UpdateWorkItem 方法。
UploadDataServiceAgent 对象可创建处理请求和提供必要上下文信息(例如 OnlineProxyContext 和 ServiceAgentContext 对象)所需的 Payload 对象。
创建 payload 后,UploadDataServiceAgent 对象会将它存储在队列中。Executor 对象从队列中提取 payload,然后调用 OnlineProxy 对象来处理请求。
OnlineProxy 对象将更新本地 XML 文件中的数据。它还可以将该信息传达到某个服务。它使用 ServiceAgentContext 对象将结果返回到控制器。
默认情况下,该快速入门使用 InMemoryQueueStorageProvider 来排队消息。用于排队的提供程序是在应用程序的配置文件中指定的。有关如何在配置文件中指定提供程序的详细信息,请参阅第 4 章“Offline Application Block 配置和安全注意事项”。
综合的端到端解决方案
“保险理赔快速入门”将本章前面部分和第 2 章中讨论的所有概念结合在一起。该快速入门说明了一个使用 Web 服务运行在服务器(也可以是本地计算机)上并提供业务功能的端到端应用程序。
注 默认情况下,在安装该快速入门解决方案时,创建虚拟目录的 Web 服务对象和脚本都会包含在其中。该脚本将在同一台计算机上创建 Web 服务。作为一种备选方法,为了模拟更加真实的情形,您可以在其他计算机上创建 Web 服务。为此,您必须对解决方案文件进行适当的更改,同时也要更改 Web 参考。
该快速入门包括两个部分:保险理赔客户端(智能客户端应用程序)和保险理赔服务(Web 服务)。
该客户端为智能客户端应用程序,它能够在脱机模式下工作。Web 服务能够将业务功能作为 Web 方法公开。
该用户界面是单个屏幕,它结合了前面的快速入门中说明的所有用户界面。屏幕上包含多个按钮,可用于强制应用程序联机或脱机,下载工作项目,以及保存在应用程序联机时要上载的工作项目。该快速入门使用了 Offline Application Block 的所有子系统。
您必须先创建 Web 服务和该 Web 服务所使用的数据库,然后才能构建该快速入门。
创建保险理赔 Web 服务及其使用的数据库
1. |
要创建 Web 服务,请运行 CreateInsuranceClaimsServiceVDir.vbs 脚本,该脚本位于 <installationlocation>\Offline\QuickStarts\src\<language>\InsuranceClaimsQuickStart\ 文件夹中。此外,您还可以按以下方式运行该脚本:依次单击 Start、All Programs、MicrosoftApplication Blocks for .NET、Offline、Quick Start Samples (C#) / (VB),然后单击 InstallInsurance Claims Service。 |
2. |
要创建数据库,您必须将 MSDE 2000 安装到计算机上。有关如何获得并安装 MSDE 2000 的说明,请参阅本章前面的“软件要求”。 |
3. |
要创建数据库,请运行 CreateWebServiceDB.cmd 脚本,该脚本位于 <installationlocation>\Offline\QuickStarts\src\<language>\InsuranceClaimsQuickStart\Database\ 文件夹中。在运行该脚本之前,您必须在 CreateWebServiceDB.cmd 脚本中更改 MSDE 2000 安装的实例名。另外,如果 MSDE 2000 没有安装在默认位置,您必须修改 InsuranceClaims.sql 脚本创建数据库文件的位置。 |
请注意,您必须在安装有 Web 服务的计算机上执行前面的步骤。
要点 默认情况下,MSDE 使用 Windows 身份验证作为其登录模式。Web 服务运行在名为 ASPNET 的默认用户下,您必须先授予该用户权限并对其进行配置,然后才能有效地使用 MSDE。有关如何授予权限和配置帐户的说明,请参阅 .NET Framework SDK QuickStart Configuration Details 文档。默认情况下,该文档位于:<运行 Visual Studio .NET 的计算机的 drive:\>Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Setup\html\ConfigDetails.htm。
但是,如果要将身份验证从 Windows 模式更改为混合模式,您必须将以下注册表项中的 LoginMode 十六进制值从 1 更改为 2: My Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\VSDOTNET\MSSQLServer。
在创建 Web 服务和数据库后,请使用下列步骤来构建快速入门。
构建“保险理赔快速入门”
1. |
在 Visual Studio .NET 2003 中打开 InsuranceClaimsQuickStart.sln 解决方案(位于 <installation location>\Offline\QuickStarts\src<language>\InsuranceClaimsQuickStart\ 文件夹中)。此外,您还可以按以下方式访问 Offline Application Block:依次单击 Start、All Programs、Microsoft Application Blocks for .NET、Offline、Quick Start Samples (C#) / (VB),然后单击 Insurance Claims Quick Start。 |
2. |
构建解决方案。这将:
• |
在 <installation location>\Offline\QuickStarts\src\<language>\InsuranceClaimsQuickStart\InsuranceClaimsClient\ 文件夹下的 bin\<build configuration> 文件夹中生成 InsuranceClaimsClient.exe 程序集。 |
• |
在 \Offline\QuickStart\src\\InsuranceClaimsQuickStart\InsuranceClaimsService 文件夹下的 bin 文件夹中生成 InsuranceClaimsService.dll。 | |
3. |
在 Web 服务配置文件中更改 datasource 名称,以指向正确的 datasource。 |
要启动该快速入门,请双击 InsuranceClaimsQuickStart.exe。
“保险理赔快速入门”文件
该快速入门的解决方案位于 <installationlocation>\Offline\QuickStarts\src\<language>\ InsuranceClaimsQuickStart\InsuranceClaimsClient\ 文件夹中。表 3.4 和 3.5 说明了与该“保险理赔快速入门”讨论相关的文件。
表 3.4:“保险理赔快速入门”文件
App.config |
指定应用程序的配置信息。 |
InsuranceClaimsQuickStartForm.cs \ .vb |
对应于应用程序的视图 (UI)。 |
Controller.cs \ .vb |
管理 UI 与连接管理器和服务代理之间的交互。它可以注册连接状态更改事件,并通过将更改传递到关联的视图来响应更改。创建 InsuranceCliamsClientServiceAgent 并使用它进行注册,以启动工作项目的下载和上载。 |
InsuranceClaimsClientServiceAgent.cs \ .vb |
启动工作项目信息的下载和上载。它可创建 Payload,并将用于下载或上载工作项目的“联机代理”和服务代理的必要上下文信息填充在其中,然后将结果返回到控制器。 |
OnlineProxy.cs \ .vb |
它负责通过与 Web 服务进行通信来下载和上载数据。 |
表 3.5:保险理赔服务的 Web 服务文件
Web.config |
指定 Web 服务所使用的数据库的位置。 |
InsuranceClaims.asmx,cs \ .vb |
公开要由客户端应用程序使用的 Web 方法。 |
详细信息
有关如何执行特定操作的信息,请参阅前面快速入门的详细信息。例如,前面快速入门中的详细信息说明了下载或上载工作项目所涉及的组件。
前面的快速入门和此快速入门的唯一不同之处在于 OnlineProxy 类的行为。要使这些快速入门保持在一个基本水平,前面快速入门中的 OnlineProxy 类要在本地检索或更新数据。在这种情况下,该快速入门将与 Web 服务进行交互,并演示了一个使用 Offline Application Block 的应用程序的端到端方案。
使用 Offline Application Block
在使用 Offline Application Block 之前,您应评估现有的提供程序,并确定是否要使用它们或创建新的提供程序。
根据应用程序的要求评估提供程序
当您要将脱机功能添加到应用程序时,必须根据下列提供程序来确定应用程序的要求:
• |
连接检测提供程序 – Offline Block 提供了 WinInetDetectStrategy 用于连接管理。您应评估它是否符合应用程序的要求,或者您是否需要开发一个自定义提供程序。例如,您可能需要一个自定义提供程序来确定特定 Web 服务是否可用。 |
• |
缓存存储提供程序 – Cache Block 提供了 MSDE、内存、内存映射文件、独立存储和 SQL Server 作为存储提供程序。您应评估所有这些提供程序是否适合您的应用程序体系结构。如果不适合,您需要创建一个自定义提供程序。例如,您可能需要将数据缓存到其他数据库引擎中。 |
• |
队列存储提供程序 – Offline Block 提供了 MSDE、内存、独立存储和消息队列作为队列存储提供程序。您应评估所有这些提供程序是否适合您的应用程序体系结构。如果不适合,您需要创建一个自定义提供程序。例如,您可能需要将数据排入其他队列存储提供程序。 |
加密提供程序– Common Block 提供了 Data Protection API 作为其加密提供程序。您应根据组织的安全性要求来评估该提供程序是否适合您的应用程序体系结构。如果不适合,您需要创建一个自定义提供程序。
有关在应用程序中使用提供程序或开发自己的自定义提供程序的信息,请参阅本章后面的“开发自己的提供程序”。
使用 Offline Block 的任务
在设计阶段,您的组织会决定 Offline Application Block 要满足的业务要求。某些要求会涉及到用户界面 (UI) 和用户界面控制器 (UIC)。这些用户界面依赖于您组织所提出的业务要求,并决定联机/脱机操作与用户之间的交互。有关 UIC 和用户界面处理 (UIP) 的讨论超出了本指南的范围。
下表向您展示了在构建具有脱机功能的应用程序时,可能要执行的常见任务。
开始
1. |
根据您开发的应用程序,实现所需的应用程序服务代理。确保应用程序服务代理从 ServiceAgent 基类中派生。 |
2. |
实现 OnlineProxy 组件(通常情况下,每个应用程序服务代理都包含一个 OnlineProxy 组件,但不是必需的),它作为应用程序与 Web 服务或与存储和检索信息的任何其他数据存储区的接口。该组件包含用于访问 Web 服务的特定于应用程序的代码。
注 有关详细信息,您可以查看“保险理赔快速入门”的 Visual C# 或 Visual Basic 代码,它位于 <installation location>\Offline\QuickStarts\src\<language>\InsuranceClaimsQuickStart\InsuranceClaimsClient 文件夹中。 |
开始访问脱机功能
1. |
通过调用 OfflineBlockBuilder.Instance 属性从 OfflineBlockBuilder 类创建一个块生成器实例。您可以使用该 OfflineBlockBuilder 类构建并访问该应用程序块的所有组件。OfflineBlockBuilder 实例通常在 UIC 的构造函数中获得,如下面的代码所示。
[C#] ...
private OfflineBlockBuilder offlineBlockBuilderInstance;
offlineBlockBuilderInstance = OfflineBlockBuilder.Instance;
...
[Visual Basic] ...
Private OfflineBlockBuilder offlineBlockBuilderInstance
offlineBlockBuilderInstance = OfflineBlockBuilder.Instance
...
|
2. |
使用“连接管理器”组件注册联机/脱机更改状态事件,如下面的代码所示。
[C#] ...
offlineBlockBuilderInstance.ConnectionManager.ConnectionState ChangedEvent += new ConnectionStateChangedEventHandler(ConnectionManager
ConnectionStateChangedEvent);
...
[Visual Basic] ...
offlineBlockBuilderInstance AddHandler offlineBlockBuilderInstance.ConnectionManager.ConnectionStateChangedEvent, AddressOf ConnectionManagerConnectionStateChangedEvent
...
|
3. |
为脱机客户端创建一个“应用程序服务代理”的实例。 |
4. |
使用“应用程序服务代理”为各种事件注册控制器。这些事件可通知最终用户在后台发生的更改。 |
5. |
如果原始的“应用程序服务代理”不可用,则使用 FailsafeServiceAgent 注册控制器以便处理错误。
[C#] ...
FailsafeServiceAgent refFailSafeServiceAgent = offlineBlockBuilderInstance.FailsafeServiceAgent;
refFailSafeServiceAgent.ErrorEvent += new MethodExecutionFailureReportEventHandler(
FailSafeServiceAgentErrorEvent);
...
[Visual Basic] ...
Dim refFailSafeServiceAgent As FailsafeServiceAgent = offlineBlockBuilderInstance.FailsafeServiceAgent
AddHandler refFailSafeServiceAgent.ErrorEvent, AddressOf FailSafeServiceAgentErrorEvent
...
|
6. |
调用 OfflineBlockBuilder 对象的 Start 方法来启动“连接管理器”。该组件将轮询连接状态,并在连接状态发生更改时将事件发送到“服务代理”。
[C#] ...
offlineBlockBuilderInstance.Start() ;
...
[Visual Basic] ...
offlineBlockBuilderInstance = OfflineBlockBuilder.Start
...
|
7. |
如果要强制应用程序在脱机模式下工作,请使用 ConnectionManager 组件的 GoOffline 方法,如下面的代码所示。
[C#] ...
offlineBlockBuilderInstance.ConnectionManager.GoOffline() ;
...
[Visual Basic] ...
offlineBlockBuilderInstance.ConnectionManager.GoOffline()
...
|
8. |
如果要使应用程序重新联机,请使用 ConnectionManager 组件的 GoOnline 方法,如下面的代码所示。
[C#] ...
offlineBlockBuilderInstance.ConnectionManager.GoOnline() ;
...
[Visual Basic] ...
offlineBlockBuilderInstance.ConnectionManager.GoOnline()
...
|
使用“应用程序服务代理”中的 DataLoaderManager 将数据加载到客户端数据存储区中
1. |
创建一个 OnlineProxyContext 对象,Executor 将使用它来调用 OnlineProxy 类上的方法。 |
2. |
创建一个 ServiceAgentContext 对象,ServiceAgentManager 将使用它在数据可用时调用“应用程序服务代理”的 callback 方法。 |
3. |
使用 OnlineProxyContext 和 ServiceAgentContext 创建一个 ReferenceDataDefinition 对象。 |
4. |
调用 DataLoaderManager 对象的 LoadData 方法,以将数据下载请求排入队列。 |
以下代码阐释了前面的步骤:
[C#]
...
string onlineProxyAssemblyName = "InsuranceClaimsClient";
string onlineProxyClassName = "Microsoft.ApplicationBlocks.SmartClient.Offline.QuickStarts.OnlineProxy";
string onlineProxyMethodName ="GetWorkItems";
string specificServiceAgentMethodTobeInvoked = "DataAvailableCallBack";
const int absoluteExpirationTime = 600;
string cacheKey = "SmartClient";
OnlineProxyContext onlineProxyMethodContext =
new OnlineProxyContext(onlineProxyAssemblyName,
onlineProxyClassName, onlineProxyMethodName);
ServiceAgentContext specificServiceAgentContext = new
ServiceAgentContext(specificServiceAgentMethodTobeInvoked);
ReferenceDataDefinition refDataDefination = new
ReferenceDataDefinition(cacheKey, absoluteExpirationTime,
onlineProxyMethodContext);
offlineBlockBuilderInstance.DataLoaderManager.LoadData(this.Guid,
specificServiceAgentContext, refDataDefination);
...
[Visual Basic]
...
Dim onlineProxyAssemblyName As String = "InsuranceClaimsClient"
Dim onlineProxyClassName As String =
"Microsoft.ApplicationBlocks.SmartClient.Offline.QuickStarts.OnlineProxy"
Dim onlineProxyMethodName As String = "GetWorkItems"
Dim specificServiceAgentMethodTobeInvoked As String =
"DataAvailableCallBack"
Const absoluteExpirationTime As Integer = 600
Dim cacheKey As String = "SmartClient"
Dim onlineProxyMethodContext As New
OnlineProxyContext(onlineProxyAssemblyName, onlineProxyClassName,
onlineProxyMethodName)
Dim specificServiceAgentContext As New
ServiceAgentContext(specificServiceAgentMethodTobeInvoked)
Dim refDataDefination As New ReferenceDataDefinition(cacheKey,
absoluteExpirationTime, onlineProxyMethodContext)
offlineBlockBuilderInstance.DataLoaderManager.LoadData(Me.Guid,
specificServiceAgentContext, refDataDefination)
...
使用“应用程序服务代理”中的 QueueManager 将数据排入队列
1. |
创建一个 OnlineProxyContext,以便调用 OnlineProxy 中的方法来下载或上载数据。 |
2. |
创建一个 ServiceAgentContext 对象,以便在数据可用或更新时调用“应用程序服务代理”中的 callback 方法。 |
3. |
使用 OnlineProxyContext 和 ServiceAgentContext 方法创建一个新的 Payload 对象。 |
4. |
调用 PayloadConsumer 对象的 Enqueue 方法,以便将数据更新请求排入队列。 |
以下代码阐释了前面的步骤:
[C#]
...
string onlineProxyAssemblyName = "InsuranceClaimsClient";
string onlineProxyClassName = "Microsoft.ApplicationBlocks.SmartClient.Offline.QuickStarts.OnlineProxy";
string onlineProxyMethodName ="UpdateWorkItem";
string specificServiceAgentMethodTobeInvoked = "DataUpdatedCallBack";
OnlineProxyContext onlineProxyMethodContext = new
OnlineProxyContext(onlineProxyAssemblyName, onlineProxyClassName,
onlineProxyMethodName);
ServiceAgentContext specificServiceAgentContext = new
ServiceAgentContext(specificServiceAgentMethodTobeInvoked);
Payload messageToEnqueue = new
Payload(onlineProxyMethodContext,this.Guid,
specificServiceAgentContext, changedAppData);
offlineBlockBuilderInstance.PayloadConsumer.Enqueue(messageToEnqueue);
...
[Visual Basic]
...
Dim onlineProxyAssemblyName As String = "InsuranceClaimsClient"
Dim onlineProxyClassName As String = "Microsoft.ApplicationBlocks.SmartClient.Offline.QuickStarts.OnlineProxy"
Dim onlineProxyMethodName As String = "UpdateWorkItem"
Dim specificServiceAgentMethodToInvoke As String = "DataUpdatedCallBack"
Dim onlineProxyMethodContext As New OnlineProxyContext(onlineProxyAssemblyName, onlineProxyClassName, onlineProxyMethodName)
Dim specificServiceAgentContext As New ServiceAgentContext(specificServiceAgentMethodToInvoke)
Dim messageToEnqueue As New Payload(onlineProxyMethodContext, _
Me.Guid, specificServiceAgentContext, _
changedAppData)
offlineBlockBuilderInstance.PayloadConsumer.Enqueue(messageToEnqueue)
开发自己的提供程序
至此,本章的重点一直是如何在不加修改的情况下将 Offline Application Block 用于您的应用程序。设计的关键方面在于,您可以利用自己的提供程序来扩展应用程序块。这些注意事项适用于您创建的任何提供程序。
开发自己的提供程序
1. |
创建一个实现子系统相应接口的提供程序类:
• |
连接检测提供程序 – 实现 IConnectionDetectionStrategy 和 IProvider 接口。 |
• |
队列存储提供程序 – 实现 IQueueStorageProvider 接口和 IProvider 接口。 |
• |
缓存存储提供程序 – 实现 ICacheStorage 提供程序接口。 | |
2. |
设置自定义提供程序的配置设置。每个子系统的提供程序都有独立的配置区段。一般规则是:将区段中提供程序的通用属性指定为特性,将自定义属性指定为元素。 |
WinInetDetectionStrategy 提供程序说明了以前的设计注意事项如何表示“连接管理”子系统用于连接检测的连接检测提供程序。
WinInetDetectionStrategy 提供程序实现 IConnectionDetectionStrategy 和 IProvider 接口。这些提供程序的配置设置在 ConnectionManagerProviders 区段中被定义为 provider 元素,其 name 特性设置为 winINetDetectionStrategy。通用属性被指定为特性,而自定义属性 pollingInterval 被指定为 provider 元素的子元素。ConnectionManagerConfigurator 类可读取配置信息,并创建该提供程序的一个实例。
设置 MSDE 和 MSMQ
在通过这些快速入门或任何自定义应用程序使用 MSDE 和 MSMQ 提供程序之前,您需要相应地设置 MSDE 和 MSMQ。
MSDE 设置
在将 MSDE 提供程序用于缓存或队列之前,您必须配置 MSDE,以使其在客户端计算机上正常工作。有关详细信息,请参阅 <drive:\ >Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Setup\html\ConfigDetails.htm。
要配置 MSDE 提供程序以用于缓存,您必须创建该缓存块所使用的必要表格和存储过程。
创建表格和过程
1. |
在 <installation location>\Offline\Database\Cache 文件夹中找到 CreateCache.cmd 脚本。 |
2. |
打开 CreateCache.cmd 文件,并更改服务器名以指向正确的服务器。 |
3. |
运行 CreateCache.cmd 脚本。 |
在将 MSDE 提供程序用于队列时,您必须创建“消息数据管理”子系统所使用的必要数据库。
创建数据库
1. |
在 <installation location>\Offline\Database\Queue 文件夹中找到 CreateQueueDB.cmd 脚本。 |
2. |
打开 CreateQueueDB.cmd 脚本,并更改服务器名以指向正确的服务器。 |
3. |
如果 MSDE 没有安装在 C: 驱动器上,您必须将 QueueDatabase.sql 文件中的路径更改为 MSDE 的正确安装路径。 |
4. |
运行 CreateQueueDB.cmd 脚本。
注 要启用用于缓存或队列的 MSDE 提供程序,请转到 App.config 文件,然后在各自的配置区段中更改 ConnectionString,以使其指向正确的 DataSource。 |
消息队列
在将 MSMQ 提供程序用于队列之前,您必须在本地计算机上配置“消息队列”。有关详细信息,请参阅 Microsoft Message Queuing (MSMQ) Center (http://www.Microsoft.com/windows2000/technologies/communications/msmq/default.asp)
如果不存在队列,Offline Application Block 将创建一个。建议您在使用消息队列提供程序之前,手动创建一个队列。这可让您根据组织的安全要求来灵活地配置“消息队列”。以下步骤说明如何手动创建队列。
手动创建专用队列
1. |
右键单击 MyComputer,然后单击 Manage。 |
2. |
在 ComputerManagement 中,展开 MessageQueuing 文件夹。 |
3. |
在控制台树中,右键单击 PrivateQueues 文件夹。 |
4. |
指向 New,然后单击 Private Queue。 |
5. |
在 Name 中,为新队列键入一个名称,然后单击 OK。
- 或者 -
要创建接受事务性消息的队列,请键入一个名称,选中 Transactional 复选框,然后单击 OK。 |
6. |
展开 Private Queues。 |
7. |
右键单击新创建的队列并选择 Properties。 |
8. |
为队列添加常规配置和安全配置(例如安全策略或权限),然后单击 OK。
注 您不能在 Outgoing Queues 或 System Queues 文件夹中创建队列。这些队列会自动创建。
在第 5 步中指定的队列名应添加到应用程序的配置文件中,替换当前的名称。 |
有关部署要求和注意事项的详细信息,请参阅第 4 章。
小结
Offline Application Block 为您提供了可用于将脱机功能添加到应用程序的灵活设计和基础结构。在许多情况下,您可以将随附的提供程序用于子系统。在某些情况下,您需要自定义这些提供程序或创建自己的提供程序。Offline Application Block 提供的这些快速入门为您提供了理解如何使用该应用程序块的有用起点。
更多信息
有关 MSDE 的详细信息,请参阅“Distributing the SQL Server Desktop Engine”。
有关 SQL Server 的详细信息,请参阅 SQL Server。
有关消息队列的详细信息,请参阅“Message Queuing (MSMQ) ”?
有关 DPAPI 的详细信息,请参阅 Windows Data Protection。
转到原英文页面