原文引自:
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。
轉到原英文頁面