我們已將大部分注意力集中在為信息工作者提供業(yè)務(wù)智能 (BI) 工具上面,以幫助他們作出更明智的決策。其中的大多數企業(yè) BI 解決方案都是通過(guò)各種資源,尤其是通過(guò)使用某種形式的服務(wù)器端信息集成來(lái)提供信息。無(wú)論是用于匯總數據的報告系統、類(lèi)似于 Microsoft? SharePoint? 的協(xié)作工具,還是用于提供業(yè)務(wù)流程管理的自定義企業(yè)應用程序集成 (EAI) 解決方案,此信息發(fā)揮的實(shí)際作用才是重點(diǎn)。無(wú)需過(guò)多考慮如何使用此信息。
對于大多數活動(dòng)來(lái)說(shuō),信息工作者在制定決策時(shí)需要參考以下幾個(gè)應用程序:用于查看門(mén)戶(hù)站點(diǎn)的 Web 瀏覽器、用于訪(fǎng)問(wèn) EAI 解決方案的自定義應用程序以及用于讀取數據匯總的報表查看器。隨著(zhù)時(shí)間的推移,通過(guò)學(xué)習如何跨應用程序邊界手動(dòng)收集和整理數據,工作人員在工作方面是越來(lái)越精通。這通常要通過(guò)啟動(dòng) Microsoft Outlook?、Word、Excel?、Internet Explorer? 以及由公司提供的各種自定義應用程序等一系列過(guò)程來(lái)實(shí)現。這種轉椅集成形式會(huì )產(chǎn)生不良后果:對新用戶(hù)的培訓時(shí)間過(guò)長(cháng)、系統不能以正確的形式為正確的人員提供正確的信息、引入了數據錯誤問(wèn)題,等等。那么,提供一個(gè)由部署模型包圍的安全集成和托管載體,從而使這種形式的應用程序集成變得更方便,是不是會(huì )更有效呢?
多數開(kāi)發(fā)人員認為面向服務(wù)的體系結構 (SOA) 是提供信息的方式,而不是使用信息的方法。但您如何處理所有的自動(dòng)化孤島呢?由此引入了集成式桌面這一觀(guān)點(diǎn)。
作為解決方案體系結構,我們旨在簡(jiǎn)化不斷擴展的業(yè)務(wù)應用程序領(lǐng)域并豐富用戶(hù)的經(jīng)驗,但是,其中最難以達到的一個(gè)目標就是跨過(guò)在桌面上運行的多個(gè)應用程序無(wú)縫集成解決方案。諸如 DDE、OLE、COM、mailslot 及類(lèi)似技術(shù)已全部用于解決本地應用程序集成問(wèn)題。但得到的卻是經(jīng)過(guò)高度耦合、容易遭到破壞的桌面應用程序,而維護和部署這些應用程序卻要花費高昂的代價(jià)。
集成式桌面是側重于桌面的已連接系統體系結構的最新部分。集成式桌面是一個(gè)松散耦合的托管體系結構,也是在桌面上運行的復合 UI,它由后端的松散耦合體系結構予以支持。它大大減少了必須由用戶(hù)處理的應用程序的數目,并將一切置于單片“玻璃”下。構建集成式桌面應用程序所需的全部技術(shù)已事先存在于 .NET Framework 中。但是,時(shí)至今日所面臨的主要挑戰仍是如何將它們無(wú)縫集成在一起。
集成式桌面策略的潛在方向是啟動(dòng)服務(wù)。雖然體系結構并非一定需要服務(wù)結構,但對于構建組合企業(yè)桌面的策略而言,服務(wù)結構卻是必要的。集成式桌面應用程序的松散耦合本質(zhì)就是對啟用服務(wù)后端的自然適用。保持松散耦合體系結構的屬性可順利完成部署,但這些種類(lèi)的體系結構在部署時(shí)常常會(huì )遇到干擾。
對于 Microsoft,實(shí)現集成式桌面的基礎層是新一代 Composite UI Application Block (CAB) 和 Smart Client Software Factory。對于精心制作個(gè)人桌面框架和自定義應用程序的解決方案架構師而言,將這兩個(gè)工具結合起來(lái)使用將會(huì )提供強大的功能。(繼續之前,請先熟悉一下提要欄“
基本術(shù)語(yǔ)”中出現的術(shù)語(yǔ)。)
CAB 工作原理
CAB 是用于構建復雜的智能客戶(hù)端應用程序的模式和概念的實(shí)現。簡(jiǎn)單來(lái)說(shuō),它提供 Windows? Forms 探測功能,以幫助構建企業(yè)桌面應用程序。
由于僅介紹 CAB 就能占據整篇文章的篇幅,而且其中有幾個(gè)組件還超出了本文所探討的范圍。因此,我們將側重于 CAB 的主要組件,但建議您下載該部分內容并做深入的研究。 從訪(fǎng)問(wèn)
CAB 社區站點(diǎn)開(kāi)始。
CAB 旨在支持多種應用程序方案,如在線(xiàn)事務(wù)處理 (OLTP) 前端、客戶(hù)端門(mén)戶(hù)以及信息工作者應用程序。由于 CAB 是模塊化設計且接觸面積較小,因此,它不但適用于大型集成式桌面,甚至還適用于簡(jiǎn)單的智能客戶(hù)端。
利用 CAB,可通過(guò)正確解耦界面的各組成部分來(lái)共享單個(gè)智能客戶(hù)端界面的開(kāi)發(fā)任務(wù)。最終,CAB 改進(jìn)了重復使用,并能夠輕松實(shí)現內部應用程序工作流之類(lèi)的概念。為了能夠重復使用,通過(guò)使用 CAB 框架構建的復合 UI 被分為多個(gè)工作部件。驅動(dòng)程序是應用程序的外殼,它相當于托管可執行程序及用于加載復合 UI 部件的引導程序。由外殼加載和顯示的 UI 元素為用戶(hù)提供“接觸點(diǎn)”,如菜單和其他導航組件。外殼與應用程序部件自行松散耦合,因此,它為 UI 設計提供了一種靈活的方法。雖然外殼和 CAB 服務(wù)握著(zhù)方向盤(pán),但必須由您為引擎提供將由外殼托管的應用程序。
除了為托管可重用的部件提供框架之外,CAB 還為諸如加載模塊、通信消息、保持狀態(tài)等任務(wù)提供了一套智能客戶(hù)端核心服務(wù)??赏ㄟ^(guò)代碼或應用程序的 .config 文件來(lái)添加這些服務(wù)。這些核心服務(wù)包括:
模塊加載程序和模塊枚舉服務(wù)是基于提供商的服務(wù),用于對列在配置目錄中的模塊的讀取和加載操作進(jìn)行控制。
事件代理服務(wù)用于在部件間以及由復合 UI 托管的子應用程序間傳遞消息。
身份驗證服務(wù)是基于提供商的服務(wù),它負責詢(xún)問(wèn)用戶(hù)的憑據、訪(fǎng)問(wèn)證書(shū)以及聯(lián)系后端數據提供商。
狀態(tài)持久性服務(wù)是基于提供商的存儲服務(wù),它用于保存工作項狀態(tài),以便共享上下文數據,以及暫停工作項并在稍后重新激活。
要為 CAB 應用程序構建引擎,通常需要首先創(chuàng )建一個(gè) CAB 模塊。模塊將為您的個(gè)人功能集提供一個(gè)可部署入口點(diǎn)(有時(shí)稱(chēng)為托管的應用程序)。模塊包含在各自的 DLL 文件中并在運行時(shí)從外殼加載。對于哪些模塊可用以及加載哪些模塊,這是完全可以進(jìn)行配置的,這由可擴展程序目錄來(lái)實(shí)現。如果您熟悉 Microsoft Enterprise Library,您會(huì )在 CAB 中識別出同一提供程序模型。在 Visual Studio? 中,無(wú)需直接在外殼項目中引用模塊,而且模塊從未直接綁定到可執行程序。而是在運行時(shí)由模塊加載程序加載這些模塊。
在模塊程序集內部,可借助 CAB 和 Smart Client Software Factory 類(lèi)型(如 Presenter、SmartPart 和 State)提供實(shí)現該功能集所必需的工作項、視圖、控制器和數據。尤其是這三項形成了基于 CAB 應用程序的 Model-View-Presenter/Model-View-Controller (MVP/MVC) 模式。當應用程序邏緝需要時(shí),注入服務(wù)。這允許開(kāi)發(fā)人員以動(dòng)態(tài)方式創(chuàng )建新的對象實(shí)例或返回已在容器中創(chuàng )建的對象。對于 CAB 來(lái)說(shuō),該容器是工作項,而且也是模塊開(kāi)發(fā)人員最先創(chuàng )建的內容之一??赏ㄟ^(guò)使用 AddNew,將 CAB 組件(如客戶(hù)端服務(wù)和工作區)顯式添加到該容器中:
_rootWorkItem.WorkItems.AddNew<WorkItemA>();
也可通過(guò)配置或以聲明的方式來(lái)實(shí)現這一操作:
[CreateNew]public ShipNewOrderViewPresenter Presenter{set{_presenter = value;_presenter.View = this;}}
在容器(工作項)范圍內,也可根據需要,以聲明的方式將這些組件解除引用。這就提供了一種松散耦合方式,以獲得對所有包含在內的、由 CAB 管理的項的訪(fǎng)問(wèn)權限(注入),如下所示:
[ServiceDependency]public WorkItem WorkItem{set { _workItem = value; }}
CAB 的一個(gè)關(guān)鍵組件是對象生成器(也供新版本的 Enterprise Library 使用)。只要實(shí)現此依賴(lài)性注入,對象生成器就能啟用大量有用的功能。它能夠在適當的時(shí)候創(chuàng )建一個(gè)新的具體類(lèi)實(shí)例或返回現有的類(lèi)實(shí)例;它能夠在某個(gè)類(lèi)提供多個(gè)實(shí)例時(shí),選擇合適的構造函數;它能夠響應屬性和方法中所聲明的屬性 (attribute),這些屬性 (attribute) 會(huì )影響新對象的創(chuàng )建和命名;它還能夠提供拆除工具,通過(guò)反轉操作鏈,將設置從現有的對象中刪除。
對象生成器的實(shí)用性很低,并且在多數情況下,您不能直接與其交互。然而,了解“依賴(lài)性注入”的概念對于了解如何將服務(wù)插入到模塊中是非常重要的,而且在調試時(shí)這些知識會(huì )對您大有幫助。有關(guān)“依賴(lài)性注入”和 CAB 中所使用的其他模式的詳細信息,請參考 CAB 文檔。
可按照您希望的方式劃分模塊。每個(gè)模塊至少應存在一個(gè)工作項,另外的工作項作為該模塊的驅動(dòng)程序。像其他任何應用程序或子應用程序一樣,也可按照您的意愿確定工作項的大小。在 CAB 應用程序中,事件的典型順序與以下類(lèi)似:
1.
用戶(hù)雙擊用于顯示外殼的 EXE。
2.
外殼引導桌面,加載任何已配置的 CAB 服務(wù),顯示其 UI 元素,然后加載所有已配置的模塊。
3.
當被加載后,每個(gè)模塊都會(huì )將一個(gè)工作項添加到其父工作項來(lái)控制該子應用程序,并讓此工作項在所提供的工作區中顯示其任一內容。
4.
當被加載后,每個(gè)模塊都會(huì )將一個(gè)工作項目添加到其父工作項目來(lái)控制該子應用程序,并讓此工作項目在所提供的工作區中顯示其任一內容。
5.
當用戶(hù)從菜單中選擇一個(gè) UI 元素時(shí),即會(huì )引發(fā)相關(guān)聯(lián)的命令。
6.
命令處理程序會(huì )通過(guò)添加一個(gè)子工作項目來(lái)響應該命令,該工作項目將控制另一個(gè)子應用程序并顯示其視圖。
7.
該工作項目通過(guò)智能部件顯示其視圖。
8.
用戶(hù)與視圖接口進(jìn)行交互,隨后視圖接口再傳遞一個(gè)控制器(或表示器)。
9.
控制器更改共享數據(狀態(tài))并使用事件代理將數據傳回主機。
10.
事件代理將該相關(guān)信息(上下文)發(fā)送到其他模塊或部件。
CAB 模塊可以是獨立的整體,也可以是由外殼所托管的一個(gè)大型模塊集的一部分。多模塊智能客戶(hù)端是 CAB 真正體現其靈活性和設計的亮點(diǎn)所在。此靈活性主要體現在,您根本不必在加載模塊程序集的外殼項目中直接引用模塊程序集,因為它們將在運行時(shí)由 CAB 加載。此外,單個(gè)模塊中的各個(gè)部件可以相互通信,也可以與外部模塊(均包含在其各自的程序集中)中運行的各部件進(jìn)行通信。
返回頁(yè)首構建簡(jiǎn)單的 CAB 應用程序
現在,讓我們構建一個(gè)單模塊應用程序。首先,我將粗略說(shuō)明如何創(chuàng )建一個(gè)簡(jiǎn)單的智能客戶(hù)端。(我將在后文中討論更復雜的集成式桌面。)
多數集成式桌面都具有一個(gè)可見(jiàn)的啟動(dòng)窗體,因此您通常都從一個(gè)“Windows 窗體”外殼開(kāi)始操作。首先,從 FormShellApplication 繼承您的類(lèi)并將其實(shí)例化,然后從您的應用程序的 Main 方法調用其 Run 方法。這將初始化 CAB 應用程序,從而加載我們先前討論的任何已配置服務(wù)。下一步涉及到覆蓋 FormShellApplication 提供的方法(例如 AfterShellCreated)以填充菜單和顯示任何可見(jiàn)視圖。(智能部件是可選項,它們只是用 SmartPartAttribute 裝飾的用戶(hù)控件。)
要在實(shí)現 AfterShellCreated 時(shí)初始化用戶(hù)界面,您需要將 CAB 所引用的內容注冊為擴展站點(diǎn)。這會(huì )提供一個(gè) UI 元素管理器,以便任何模塊在以后任何時(shí)候都可以添加來(lái)自任何模塊的子 UI 元素(例如,菜單項或工具欄項)。最后,在外殼對通常也在此初始化期間添加的 UI 元素命令進(jìn)行加載或響應時(shí),您開(kāi)始顯示您的視圖。由于各命令綁定了命令處理程序,因此您的代碼在運行時(shí)可以對任何普通 UI 元素引發(fā)的任何命令作出響應;這與添加通常的事件處理程序相似,只不過(guò)方式更為抽象一些。
可通過(guò)使用 SmartPartPlaceHolder 類(lèi)或 CAB 中稱(chēng)為工作區的區域來(lái)顯示視圖。它們只是用于以給定排列方式顯示視圖的布局容器。如果您曾使用過(guò) Java 抽象窗口工具包 (AWT),您就應熟悉此概念。
最后,要創(chuàng )建外殼,請注冊一個(gè)接口并顯示一個(gè)智能部件。提要欄中的“
創(chuàng )建簡(jiǎn)單的智能客戶(hù)端:分步指南”詳細介紹了如何構建一個(gè)非常簡(jiǎn)單但模塊化的智能客戶(hù)端。要展現 CAB 的真正功能,您應使用模塊將您的各部件封裝到各自的程序集中。這為您提供了設計時(shí)抽象以及類(lèi)似于 COM 提供的運行時(shí)抽象,但消除了所有復雜性。
使用各模塊,您可以托管通過(guò)功能集自身的程序集部署的獨立功能集。這意味著(zhù)各組織可以在不影響整個(gè)集成式桌面的情況下對各個(gè)模塊進(jìn)行版本處理、部署和功能增強。模塊程序集文件(不直接在 EXE 中引用)在運行時(shí)通過(guò)模塊加載程序和枚舉服務(wù)進(jìn)行加載。CAB 的配置文件目錄和應用程序配置文件使您可以指定要將哪些模塊加載、部署和綁定到外殼中。提要欄中的“
創(chuàng )建模塊和模塊初始化程序”將逐步向您介紹創(chuàng )建模塊及其初始化程序的過(guò)程。我所羅列出的步驟清楚描述了如何創(chuàng )建一個(gè)簡(jiǎn)單的 CAB 應用程序。但是請注意,我們此處論及的只是問(wèn)題的表面。
隨 CAB 一起安裝的“Bank Teller”快速入門(mén)示例是一個(gè)現成的單模塊 CAB 應用程序。它將向您介紹我在此處所概述的所有關(guān)鍵組件。
當然,當構建真正的企業(yè)集成式桌面時(shí),會(huì )涉及到更多內容,而不僅僅是復合的 UI 塊這么簡(jiǎn)單。您需要解決大量復雜問(wèn)題,例如,如何在模塊間共享信息、如何將非 CAB 應用程序集成到桌面中、如何處理安全問(wèn)題以及如何控制布局。
返回頁(yè)首Smart Client Software Factory 簡(jiǎn)介
在創(chuàng )建企業(yè)就緒型應用程序時(shí),除了 CAB 提供的核心服務(wù)之外,您還需要其他類(lèi)的基礎服務(wù)。這些服務(wù)包括幫助您在部署、安全性和置備等方面管理桌面的工具。您可能還需要日志記錄、工作流、配置和緩存處理之類(lèi)的服務(wù),以確保所有模塊在這樣松散耦合的環(huán)境中正常運行。
Smart Client Software Factory 可以通過(guò)提供指南和引用實(shí)現來(lái)助您一臂之力。Smart Client Software Factory 不僅僅是一個(gè)工具包,它還提供了智能客戶(hù)端基本核心服務(wù)的使用入門(mén)集,以幫助您著(zhù)手建立企業(yè)就緒型集成式桌面。
所有服務(wù)均可視為可選服務(wù)和可擴展服務(wù)。Smart Client Software Factory 構建于 CAB 和 Enterprise Library 之上,并利用了現有應用程序塊。圖 1 例示了借助 Smart Client Software Factory 構建的智能客戶(hù)端服務(wù)的體系結構。
圖 1 智能客戶(hù)端服務(wù)
因為多數公司都需要一組常用服務(wù),因此 Microsoft 已將一個(gè)相關(guān)資產(chǎn)集合內置于 Smart Client Software Factory 中。它們由兩個(gè)引用實(shí)現來(lái)凸顯,這兩個(gè)引用實(shí)現可將典型經(jīng)驗映射到 Smart Client Software Factory 內所包含的服務(wù)?!耙脤?shí)現 1”模擬了“貸款評估桌面”并利用了離線(xiàn)工作能力、最終用戶(hù)通知和其他類(lèi)似功能?!耙脤?shí)現 2”模擬了“銀行職員桌面”(Bank Teller 示例的一個(gè)多模塊版本)以演示安全服務(wù)、部署服務(wù)和主題服務(wù)。
指南包所提供的幫助對構建企業(yè)應用程序非常有價(jià)值。它們使用相對較新的 Guidance Automation Toolkit (GAT)(該工具包是對 Visual Studio 2005 的擴展)構建而成。在使用 GAT 時(shí),團隊開(kāi)發(fā)人員可以提供啟動(dòng)工具包(或 SDK),這樣其他開(kāi)發(fā)人員就可以在將來(lái)添加模塊和其他 ID 部件。Smart Client Software Factory 包括一個(gè)必不可少的元素,即用于智能客戶(hù)端開(kāi)發(fā)的 Visual Studio Guidance Package。這是由指導 ID 開(kāi)發(fā)人員經(jīng)歷整個(gè) CAB 開(kāi)發(fā)生命周期的工具、模式、源代碼和說(shuō)明性指導組成的一個(gè)集成式集合。若想了解詳細信息以及下載 GAT,請訪(fǎng)問(wèn)
msdn.microsoft.com/vstudio/teamsystem/Workshop/gat/default.aspx。
返回頁(yè)首基本的智能客戶(hù)端服務(wù)
集成式桌面構建于 Smart Client Software Factory 和 CAB 之上。它應采用一個(gè)可重用集合的形式,這個(gè)集合由 CAB 擴展、Smart Client Software Factory 實(shí)現、普通基礎服務(wù)以及可整體或部分添加到任何現有復合 UI 應用程序中的庫組成。這就構成了“集成式桌面框架”,其中包含一些基本服務(wù)。
上下文服務(wù) 這是創(chuàng )建集成式桌面的最重要元素之一。它也很可能是最容易被理解錯誤的元素之一。當使用由若干模塊組成的 CAB 應用程序時(shí),您通常會(huì )采用某種形式的信息共享。例如,您的 CAB 應用程序可能包括一個(gè)外殼、一個(gè)用于顯示客戶(hù)信息的模塊、一個(gè)用于顯示匯總數據的標題模塊、一個(gè)搜索模塊以及其他任務(wù)特定的模塊。其中每一個(gè)模塊都可以單獨開(kāi)發(fā)、部署和維護。如果您想探究如何實(shí)現這些任務(wù),可以借助提供了相關(guān)“方法”的 CAB。但您還需要確定“內容”,也就是將在這些模塊之間共享的信息。這可能僅指客戶(hù) ID。事件代理會(huì )將“上下文已更改”這樣的事件進(jìn)行全局通信,并且所有模塊都會(huì )在相應時(shí)間顯示相應信息。您將廣播客戶(hù) ID 這樣的事實(shí)說(shuō)明它是要共享的信息,并且這形成了“上下文”的前提。
上下文服務(wù)只用于廣播和檢索這些共享信息,在某種程度上,這與企業(yè)桌面所提出的策略一致。您應采用一組基本的上下文類(lèi)型及其相應的架構合約才能在您的桌面中提供其他任何服務(wù)。這類(lèi)似于 SOA 中所使用的“合約至上”的設計實(shí)踐。您并不是要遵守在 Web 服務(wù)端點(diǎn)所定義的合約,而是要在桌面自身的各部件之間定義這些相同的合約。實(shí)際上,在構建集成桌面應用程序時(shí),也存在 EAI 或 SOA 項目中存在的相同難題。
部署服務(wù) 這些服務(wù)通過(guò)確保各個(gè)模塊可以在運行時(shí)部署到桌面來(lái)提供集成式桌面應用程序及其部件。一個(gè)選擇是將部署服務(wù)構建于 ClickOnce API 之上。這些服務(wù)應該對要下載到桌面的特定可選模塊提供服務(wù)器端控制。當外殼啟動(dòng)時(shí),身份驗證服務(wù)將為部署服務(wù)提供證據來(lái)證明:已為用戶(hù)啟用特定模塊,這樣,如果這些模塊已不存在,則必須將其下載到桌面。模塊將被下載,并由模塊加載程序進(jìn)行加載,然后在需要時(shí)顯示給用戶(hù)。CAB 使您可以向配置文件目錄添加用戶(hù)角色。部署服務(wù)的實(shí)現程序可以輕松地擴展通常的模塊加載程序服務(wù)以利用此功能,因為 CAB 在模塊加載程序擴展中將只對在當前附加到運行主體的已知角色條件下被授權運行的模塊調用加載。
安全服務(wù) 與上下文服務(wù)不同,安全服務(wù)非常易于理解。您可以將其構建于所提供的在 CAB 中已有的身份驗證服務(wù)之上。這為使用自定義身份驗證服務(wù)提供了一個(gè)起點(diǎn),并提供了一種向集成式桌面應用程序統一添加身份驗證邏輯的方法。使用 CAB 和 Smart Client Software Factory 提供的服務(wù)及指南,您可以將各角色添加到各個(gè)模塊中,以指明這些模塊與特定角色相關(guān)聯(lián)。這使您可以根據登錄者的角色控制要加載哪些模塊,并可以啟用其他功能(例如您的部署服務(wù))來(lái)控制實(shí)際要將哪些模塊部署到桌面。
集成服務(wù) 如果受管的 Windows 窗體應用程序是要集成到智能客戶(hù)端中的唯一候選程序,則部署單個(gè)企業(yè)桌面就沒(méi)有太大用處。通常需要集成大量的預編寫(xiě)(傳統)應用程序,以便它們在保持自治性的同時(shí)仍可作為桌面體驗的一部分。其中包括不是用 .NET 創(chuàng )建的 Web 應用程序、ASP.NET Web 應用程序、COM 應用程序,甚至包括綠屏。
Smart Client Software Factory 中的集成服務(wù)提供了將這些服務(wù)中的某些服務(wù)內置于您的集成式桌面中的指南。本文將特別介紹一種類(lèi)型的傳統桌面應用程序集成 - Web 應用程序。我們將向您介紹 CAB 和 Smart Client Software Factory(及其指南包)如何幫助您構建一個(gè)可以采用任何 Web 應用程序并可以輕松將其托管的 Web 模塊。
返回頁(yè)首集成式桌面的功能層
一個(gè)集成式桌面由三層組成:基礎層、平臺層和應用程序層。在開(kāi)發(fā) ID 解決方案時(shí),了解這些層以及它們將影響體系結構的哪些等級是至關(guān)重要的。圖 2 例示了這些層與集成式桌面體系結構中各個(gè)級別之間的關(guān)系。
圖 2 集成式桌面體系結構
基礎層 該層包含了 CAB 提供的所有核心客戶(hù)端服務(wù),以及可以由任何模塊或智能部件使用的安全性和部署之類(lèi)的服務(wù)。這些服務(wù)代表了桌面的聯(lián)合水平組件。CAB 和 Smart Client Software Factory 均提供了基礎層的主要部分。在構建“集成式桌面框架”時(shí),首先需要著(zhù)手處理的就是該層及其相應的客戶(hù)端服務(wù)。
平臺層 該層針對的是提供特定于平臺或技術(shù)的元素(例如由傳統服務(wù)處理的元素)的服務(wù)。它由模塊或智能部件開(kāi)發(fā)人員可用來(lái)合并部件(要考慮到它們所源于的平臺)的組件構成。如果您有多個(gè) Web 應用程序需要集成到桌面,則提供可重用的客戶(hù)端 Web 應用程序服務(wù)來(lái)作為“集成式桌面框架”的一部分將有助于托管這些應用程序。例如,您可能想要使用已經(jīng)在生產(chǎn)環(huán)境中運行的現有購物車(chē)應用程序。來(lái)自平臺層的服務(wù)可以用于在桌面托管此應用程序,使其像其他任何受管模塊一樣工作。Smart Client Software Factory 提供了一組傳統服務(wù)來(lái)作為該層的一部分。
應用程序層 僅包含應用程序和可重用的客戶(hù)端業(yè)務(wù)功能,此應用程序層提供了特定于業(yè)務(wù)的客戶(hù)端服務(wù)。該層由您通常需要進(jìn)行交互的模塊組成,例如搜索模塊、客戶(hù)信息模塊和購物車(chē)模塊。
返回頁(yè)首集成傳統 Web 應用程序
在 CAB 應用程序中托管現有 Web 應用程序所需要的不僅僅是向智能部件添加一個(gè)瀏覽器控件??蛻?hù)端集成的要點(diǎn)是所有應用程序(或模塊)均已完全集成。這意味著(zhù)它們可以雙向通信和共享信息。直到 CAB 可用,此功能才可行,但解決方案只是說(shuō)明性的,離可重復使用還差得很遠。
但正如上面提到的,現在可以創(chuàng )建 Web 模塊來(lái)托管任何 Web 應用程序。而且您可以做到這些,無(wú)需任何其他模塊了解其中的差異?,F有模塊從未需要改變它們共享信息的方式。
現在我們將逐步介紹構建簡(jiǎn)單 Web 模塊(如圖 3 中所示的模塊)的過(guò)程,這要依賴(lài)于由 Smart Client Software Factory 團隊提供的指南。我們使用 CAB 服務(wù)以及由 Smart Client Software Factory 提供的新的指南包。
圖 3 由 Web 模塊托管的 Web 應用程序
您需要做的第一件事是新建一個(gè) Web 應用程序或擴展現有的應用程序。本示例概述了創(chuàng )建新 ASP.NET Web 應用程序的步驟。您也可以將其用作修改現有 Web 應用程序的模板。我們使用的過(guò)程稍微有點(diǎn)侵略性:您必須將 JScript? 添加到應用程序,而且在設計時(shí)通過(guò)添加代碼利用對象模型與 Web 應用程序通信。
在創(chuàng )建樣例 Web 頁(yè)面(該頁(yè)面將用作典型 Web 應用程序)后,創(chuàng )建一個(gè) Web 模塊。但在這樣做之前,必須下載以下必備條件:
?
Guidance Automation Extensions (GAX)
?
Composite UI Application 指南包(確保在當前解決方案中啟用此功能)
?
Composite UI Application Block
?
包含到 CAB 庫和 Smart Client Software Factory 的適當引用的簡(jiǎn)單外殼應用程序
?
包含所有可在某些其他模塊和應用程序庫中重復使用的公用代碼的庫項目
作為 Smart Client Software Factory 的一部分,諸如 Microsoft.Practices.SmartClient.Web.WebPresenter 和 Microsoft.Practices.SmartClient.Web.WebView 之類(lèi)的類(lèi)提供基本探測功能,以便使用 CAB 的事件代理自動(dòng)映射由 Web 頁(yè)面觸發(fā)的事件。從而使任意 Web 模塊能夠利用內置于 CAB 中的默認通信機制,并能夠使所有事件自動(dòng)流入和流出 Web 頁(yè)面。Microsoft.Practices.SmartClient.Web.WebView 繼承自瀏覽器控件,可在 Web 模塊中重復使用。
請注意,指南包是可選的,并且僅自動(dòng)提供您的項目中的一些模板代碼,如 Smart Client Software Factory 提供的服務(wù)。作為替代方法,您也可以從本文下載樣例 Web 頁(yè)面和 Web 模塊。
步驟 1:創(chuàng )建 Web 頁(yè)面 我們將從創(chuàng )建 Web 頁(yè)面著(zhù)手,該頁(yè)面將用作我們的傳統 Web 應用程序。
1.
新建一個(gè) Web 項目或向現有 Web 項目中添加一個(gè)新頁(yè)面。
2.
或者,向可能包含 Web 應用程序所使用的常量的任何公用庫中添加引用。
3.
添加一個(gè) HTML 按鈕,其“Text”(文本)屬性值為“觸發(fā)上下文已更改的事件(來(lái)自 JavaScript)”。
4.
添加一個(gè) ASP.NET 按鈕,其“Text”(文本)屬性值為“觸發(fā)上下文已更改的事件(來(lái)自 ASP.NET 服務(wù)器)”。
5.
添加一個(gè) HTML 文本框,其 id 為“txtCustomerName”。
6.
在頁(yè)面的 Page_Load 方法中添加以下代碼(僅在使用 ASP.NET 服務(wù)器控件時(shí)才是必需的):
ClientScript.RegisterOnSubmitStatement(cstype, Common.Events. ContextChanged, BuildRaiseEvent(Common.Events.ContextChanged));
7.
添加以下 private 方法(也是僅在使用 ASP.NET 服務(wù)器控件時(shí)才是必需的):
private string BuildRaiseEvent(string topic) { StringBuilder sb = new StringBuilder(); sb.Append("window.external.FireEvent(\""); sb.Append(topic); sb.Append("\",0);"); return sb.ToString(); }
8.
雙擊第一個(gè)按鈕,在 onclick 事件中添加以下代碼:
window.external.FireEvent("ContextChangedEvent","Param1");
此代碼將觸發(fā) Web 頁(yè)面中的事件,并經(jīng)由 Smart Client Software Factory 轉為 Web 瀏覽器代碼,然后使用事件代理進(jìn)入智能客戶(hù)端。
9.
在上一步的 onclick 事件處理程序之后添加以下代碼:
function EventBroker_Subscribe() { window.external.SubscribeEvent("ContextChangedEvent"); window.external.SubscribeEvent("CustomerContextChangedEvent"); } function EventBroker_ContextChangedEvent() { window.alert("上下文已更改事件:來(lái)自 Web 應用程序的問(wèn)候"); }
通過(guò) Subscribe 事件處理程序,智能客戶(hù)端可將何時(shí)設置事件訂閱告訴給 Web 頁(yè)面(通常在 Web 頁(yè)面將其自己載入瀏覽器控件后)。接下來(lái),Web 頁(yè)面觸發(fā)并返回到主機,然后調用 SubscribeEvent(Web 頁(yè)面要訂閱的事件)。這樣,只要觸發(fā)該事件,CAB 中的所有全局事件就會(huì )從智能客戶(hù)端流動(dòng)到 Web 頁(yè)面。這在 JScript 的 EventBroker_XXX 事件處理程序中捕捉。
10.
添加以下 JScript 函數:
function EventBroker_CustomerContextChangedEvent(eventData) { document.getElementById(‘txtCustomerName‘).value = eventData.Name; }
這顯示如何將事件數據從智能客戶(hù)端傳遞到 Web 頁(yè)面以及如何在 Web 頁(yè)面中使用這些數據。
步驟 2:創(chuàng )建 Web 模塊 要創(chuàng )建 Web 模塊,請首先右鍵單擊解決方案,然后選擇“Add”(添加)|“CompositeUI”|“Module”(模塊)。在“Add New Project”(添加新項目)對話(huà)框中,指定您自己的模塊名稱(chēng)?,F在,單擊“OK”(確定),選擇“Shell”(外殼)項目,然后單擊“Finish”(完成)。
您會(huì )發(fā)現已創(chuàng )建了許多新項。一個(gè)新的 Web 模塊項目已添加到解決方案中。必需的引用(包括 CAB 和 Smart Client Software Factory 庫引用)已添加到該 Web 模塊項目中。已在新項目中創(chuàng )建了 WorkItems 文件夾,并在該項目中創(chuàng )建了 ModuleInit.cs 文件和類(lèi)。
步驟 3:新建 WorkItem 新建 WorkItem 相當簡(jiǎn)單。首先右鍵單擊剛創(chuàng )建的模塊中的 WorkItems 文件夾,然后選擇“Add”(添加)|“CompositeUI”|“WorkItem”。將名稱(chēng)更改為 WebWorkItem.cs。選擇“Shell”(外殼)項目并單擊“Finish”(完成)按鈕。
此時(shí),您將發(fā)現已創(chuàng )建了 WebWorkItem.cs 文件和類(lèi)。此外,還為 CAB 和 Smart Client Software Factory 添加了 using 指令和必需的引用。
在 ModuleInit 類(lèi)的 Load 中,添加以下代碼:
WorkitemCatalog.RegisterWorkItem<WebWorkItem>();
并將以下 using 指令添加到 ModuleInit.cs 文件的頂部:
using WebModule.WorkItems.WebWorkItem;
步驟 4:新建視圖 此步驟解決 Web 頁(yè)面和智能客戶(hù)端應用程序(在本例中為 Web 模塊)之間的數據交換。
1.
右鍵單擊 WebWorkItem 文件夾。
2.
選擇“Add”(添加)|“CompositeUI”|“View…”(視圖…)
3.
將名稱(chēng)更改為 WebView,然后單擊“Finish”(完成)按鈕。這將創(chuàng )建 IWebView 接口、WebPresenter 類(lèi)和 WebView usercontrol。它們用于實(shí)現在整個(gè) Smart Client Software Factory 中使用的典型 MVP 模式。
4.
轉到 WebWorkItem 類(lèi),然后添加以下代碼:
public void ShowInView(IShellView view) { WebView webView = this.Items.AddNew<WebView>(); view.MainWorkspace.Show(webView); }
這會(huì )將 WebView(一個(gè)智能部件)添加到工作項“智能部件”集合的項集合中,并在工作項啟動(dòng)時(shí)顯示該智能部件。
5.
在設計器模式中打開(kāi) WebView UserControl。
6.
從 Smart Client Software Factory 添加 Microsoft.Practices.SmartClient.Web.WebView 控件。
7.
將 Microsoft.Practices.SmartClient.Web.WebView 控件的 Url 屬性設置為您剛創(chuàng )建的測試 Web 頁(yè)面。
8.
轉到 WebWorkItem.cs 文件并添加以下 using 指令:
using Microsoft.Practices.SmartClient.UI.Themes;
9.
打開(kāi) WebPresenter 類(lèi)并添加以下代碼:
[EventSubscription(Common.Events.ContextChanged, Thread=ThreadOption.UserInterface)] public void OnContextChange(object sender, EventArgs e) { System.Windows.Forms.MessageBox.Show( _ "上下文已更改:來(lái)自豐富 UI 組件的問(wèn)候"); }
這由 Web 頁(yè)面觸發(fā),通過(guò) CAB 事件代理轉換為 WebView 代碼。
10.
添加以下 using 指令:
using Microsoft.Practices.CompositeUI.EventBroker;
11.
打開(kāi) IWebView 接口并添加以下代碼:
event WebBrowserDocumentCompletedEventHandler DocumentCompleted;
12.
打開(kāi) WebPresenter 類(lèi)并添加
圖 4 中所示的代碼。這允許 Smart Client Software Factory 通過(guò)綁定訂閱響應 Web 頁(yè)面加載。加載 Web 頁(yè)面時(shí),觸發(fā) CustomerContextChangedForWebPage 事件。將通過(guò)事件代理以 CustomerContextChanged(在 JavaScript 中)形式將其通知給 Web 頁(yè)面。這是在從智能客戶(hù)端啟動(dòng) Web 模塊時(shí),上下文或信息從智能客戶(hù)端流動(dòng)到 Web 頁(yè)面的作用,它允許任何 Web 應用程序在響應加載時(shí)顯示來(lái)自智能客戶(hù)端的任何信息。請注意,發(fā)送過(guò)程中的覆蓋操作并非必要,只是在加載特定事件時(shí)引發(fā)該事件。
13.
添加以下 using 指令:
using System.Threading; using System.Security.Principal; using Microsoft.Practices.CompositeUI.Utility;
14.
將以下代碼添加到 WebView 類(lèi)(IWebView 實(shí)現):
public event WebBrowserDocumentCompletedEventHandler DocumentCompleted { add { this.webView1.DocumentCompleted += value; } remove { this.webView1.DocumentCompleted -= value; } }
步驟 5:在與外殼應用程序相同的目錄中構建和測試 Solution Place WebModule.dll,并將該模塊添加到 ProfileCatalog.xml,以便 CAB 模塊加載程序服務(wù)能夠加載它。
最后,按照傳遞消息時(shí)所使用的同一模式,使用事件代理將其傳遞到其他模塊。像啟動(dòng)任何其他 Web 模塊一樣來(lái)啟動(dòng)此 Web 模塊?,F在,所有全局事件都應從智能客戶(hù)端流動(dòng)到 Web 模塊,然后再流動(dòng)回智能客戶(hù)端。
返回頁(yè)首對未來(lái)的展望
在我的樣例中,討論如何通過(guò)文檔對象模型 (DOM) 將 JavaScript 的一個(gè)小塊傳送回托管應用程序。這是使得基于 HTML 的操作窗格能夠訪(fǎng)問(wèn) XML 文檔的 DOM 時(shí),InfoPath? 所使用的一項技術(shù)。
對于現有的基于 Web 的應用程序而言,這種方法相對來(lái)說(shuō)具有一定的侵略性。它需要更改 Web 應用程序,重新編譯該應用程序,然后再對其進(jìn)行重新部署。讓我們想像一下存在這樣一種攻擊性較小的方法:它允許任何智能部件將必要的集成代碼注入到 HTML 頁(yè)面的 DOM 中,在運行時(shí)而不是在編譯時(shí)執行綁定。當然,還需要執行一定的關(guān)于安全影響的嚴格審查。還要必須將其他功能添加到 Smart Client Software Factory 的事件代理中,以便在智能客戶(hù)端上下文和 HTML 頁(yè)面元素之間映射技術(shù)。
企業(yè)就緒模塊的未來(lái)是值得期待的。想像一下基于 Windows Workflow Foundation 的工作流模塊,它會(huì )為基于桌面的工作流方案提供一個(gè)全新的托管體系結構。工作流會(huì )立刻集成到由集成式桌面托管的現有應用程序中,為信息工作者提供另外一個(gè)能夠做出決策的集成載體以及一個(gè)結構化的任務(wù)列表外觀(guān)。那么,是否能夠通過(guò)一組工作流模塊將整個(gè)解決方案重構為耦合在一起的服務(wù)島呢?
這一體系結構正在研發(fā)中,而且必須不斷地將平臺的新功能包括在該體系結構中。持久性是企業(yè)級解決方案體系結構的真正測試之一。由 Windows Vista? 引入的新功能無(wú)疑會(huì )對我們如何考慮解決方案方法帶來(lái)挑戰,而集成式桌面恰好利用了所興起的新功能。
Christian Thilmany 是一位技術(shù)架構師,在體系結構的設計、開(kāi)發(fā)和咨詢(xún)方面擁有超過(guò) 16 年的經(jīng)驗,曾為各種財富 500 強企業(yè)提供咨詢(xún)服務(wù)。在 Microsoft,他擅長(cháng)于集成、門(mén)戶(hù)以及智能客戶(hù)端模式和技術(shù)。
Jim Keane 是一位技術(shù)總監,在德克薩斯州奧斯汀市工作。他曾有 20 多年的計算機行業(yè)架構師的經(jīng)歷,在小型企業(yè)、航空航天、半導體、保險和過(guò)程控制系統等領(lǐng)域具有豐富經(jīng)驗。