Programming Microsoft Composite UI Application Block and Smart Client Software Factory by David S. Platt
Publisher: Microsoft Press Pub Date: July 25, 2007
Print ISBN-10: 0-7356-2414-3 |
Print ISBN-13: 978-0-7356-2414-6 |
Pages: 224 另一本是 Practical Software Factories in .NET 這兩本分別是06,07年出版的,不算太舊吧,跟最新的版本應該有很多地方是相同相近的。粗略看了一下,感覺第一本略好一些。 --------------------------------------------------------------------------------------------------------------- 看了網上一些文章,說一說自己對這個架構淺薄的見解吧 首先說說這個"Composite UI Application Block",大家都喜歡把它簡稱為CAB,從字面上理解就是“可組合的UI程式塊”,看到這個名字不要迷糊,做過web的人應該都聽說過webpart,其實就是一個可制定功能介面的程式,跟據使用者的需要可以顯示不同的子功能子視窗在一個首頁面或主表單中 那麼這個Composite UI Application Block實際也就是webpart的案頭形式! 這樣做的好處有很多,重用模組,自由組合的介面,高度的使用者可定製化,外掛程式形式的系統(此架構把功能模組都分成一個個dll,而不是傳統形式的一個單個的exe,而這些dll又可以通過xml檔案來配置,模組有修改時只需要替換dll),便於維護和擴充。還有介面和商務邏輯的分離(使用了MVC模式),等等。 此架構還有另外一些特性,實現了控制反轉,依賴注入,基本上這都是一個靈活架構所必要的特性。 好了,其它的特性的待實際項目中再慢慢研究。另外網上也找到一篇很詳細的文章,轉載一下 地址也貼出吧 http://hi.baidu.com/ivanbobo/blog/item/f200fb2ef9982e5a4ec22619.html ------------------------------------------------------------------華麗的分隔線-------------------------------------------------------------------- 最近開發需要用到Smart Client Software Factory(SCSF)進行Smartclient的開發,SCSF其實是基於CAB和企業庫的一個軟體工廠開發套件,核心就是CAB,所以瞭解SCSF其實就是需要對CAB進行瞭解,在網上找了些資料,放在這裡以便查閱: 文章引用:http://www.cnblogs.com/mixiaobo/archive/2008/01.html 1,Composite UI Application Block (CAB) 介紹 微軟開發了一套開源的企業庫 (Enterprise Library),通過使用這套企業庫裡面提供的各種應用程式塊可以極大的提高應用程式的開發效率和縮短開發週期,也由此得到了大家的廣泛應用。 企業庫包括大家熟知的如下應用程式塊: Caching Application Block. Cryptography Application Block. Data Access Application Block. Exception Handling Application Block. Logging Application Block. Security Application Block. Validation Application Block. Policy Injection Application Block. 這些應用程式塊都是一些常用的非業務相關的公用模組,相關資料在網上搜一下就一大堆,所以很多使用過企業庫的朋友應該並不陌生。所以這裡也就不再多說。 我今天要給大家介紹的其實也是一個應用程式塊,但是是獨立於企業庫單獨安裝的。網上也能搜到一些相關資料,但總覺不夠全面,如果不看安裝程式提供的協助文檔,網上查到的很多中文文章,還真讓人看的一知半解。知其然,不知其所以然,所以本人就乾脆看著協助文檔來細細研究。先給個:http://www.microsoft.com/downloads/details.aspx?FamilyId=7B9BA1A7-DD6D-4144-8AC6-DF88223AEE19&displaylang=en 下載後會有一個CAB_CS的安裝檔案,安裝即可。 按照微軟官方的說法,Composite UI Application Block (CAB)使用了目前商業用戶端應用程式常用的設計模式來構建了一個靈活的基礎架構。基於這個架構可以很容易的協助你編寫運行在microsoft .net平台上的具有複雜使用者互動介面的Windows Form 應用程式。那麼他有哪些優點呢? 1:允許構建由各個具有協作關係的獨立模組組合成的複雜應用。 2:分離關注點,能將各個模組的開發的關注點和Shell的開發分離開來。 3:提供了一個能支援高品質的案頭應用開發的架構 4:提高了生產力和節約了開發時間,進一步鞏固了架構師和開發人員的勞動成果。 這些特點如何體現出來呢?我後面的文章將和大家一同來分析。 2,Composite UI Application Block (CAB) 概念和術語 首先我們來看看Composite UI Application Block中涉及的相關概念和術語。這裡會做一個簡單的介紹,後續文章會詳細說到其用法。 應用程式架構元素 CAB. Composite UI Application Block的縮寫 Module. 應用程式的組成組件,其中包含SmartParts,支援Service,商務邏輯和配置資訊等 ObjectBuilder.通過策略和配置資訊自動建立對象執行個體的物件建構器。 Shell. 承載了使用者介面元素,SmartPart,服務的外殼宿主程式。 Visualizer. CAB中提供的,可以查看應用程式中的WorkItem的動態分級視圖的工具。 外殼元素 shell application. 承載了使用者介面元素,SmartPart,服務的外殼宿主程式。 SmartPart. 一個展現資料的視圖,比如控制項,Windows 表單或是一個嚮導頁。 SmartPartInfo. 存放SmartPart的相關資訊的類,以便被workspace所使用,比如可以在Smartpartinfo中設定SmartPart的顯示標題。 UIElement. 一個以Shell作為宿主的控制項,該控制項能被多個Module所共用,這樣的控制項有:toolbar button , menuitem , status panel等 UIElement adapter. 管理特殊類型的UIElement的顯示的類 Workspace. 封裝了控制項和SmartParts的某種可視化的布局的組件,比如以Tab方式顯示頁面。 相關模式 Blackboard. 通過提供一個共用資訊的地方,使其他組件能設定或擷取這個地方的資訊,已達到資訊共用的模式。 Builder/Inversion of Control/Dependency Injection. 該模式通過組件之間的依賴關係進行運行時的注入,來達到組件重用和鬆散耦合的目的。 Event Broker. 允許鬆散耦合的組件通過發布訂閱的方式進行通訊的模式。 Memento.持久化一個對象的內部狀態狀態,並在需要的時候可以在後期對狀態進行恢複的模式。 Model-View-Controller (MVC). 該模式將領域模型,視圖和基於使用者輸入產生的行為(控制器)分成3個不同的組成部分。視圖部分提供給使用者進行互動,互動資訊通過視圖傳到控制器,控制器更新模型,模型引發事件,從而更新視圖。關係圖如下: Model-View-Presenter (MVP). 該模式將領域模型,視圖和基於使用者輸入產生的行為(控制器)分成3個不同的組成部分。視圖部分提供給使用者進行互動,互動資訊通過視圖傳到控制器,控制器更新模型,模式觸發事件到控制器,同時,控制器負責更新視圖。關係圖如下: 相關編程模型 Component. 應用程式的可視或非可視組成組件,比如SmartParts, services, 和控制項. Container. 包含了組件或服務的類。 event broker. 支援鬆散耦合的發布訂閱事件機制的系統。 State. 存在於WorkItem中,以鍵-值的字典的方式來存放共用資訊。 Service.以鬆散耦合的方式為其他的組件提供功能的組件。比如:ModuleLoaderService WorkItem. 運行時的組件和服務的容器,該容器能協作其中封裝的用例代碼的執行。一般WorkItem和用例對應。 相關角色 infrastructure developer. 負責進行應用程式的基礎服務的開發的開發人員。 module developer. 負責進行應用程式的業務組件的開發的開發人員。 shell developer. 負責建立應用程式外殼的開發人員。 SmartPart developer. 負責開發應用程式的SmartParts的開發人員。 3,Composite UI Application Block (CAB) 結構介紹
CAB提供了一個非常靈活的編程架構,利用這一架構,可以很好的將一個應用分離成不同的模組進行開發。 我們來看看一個基於CAB的典型應用都有哪幾部分組成: 首先一個CAB應用需要通過繼承自FormShellApplication的應用程式類來進行啟動。FormShellApplication需要傳入兩個型別參數,繼承自WorkItem的類,和繼承自Form的類(應用程式主介面FormShell)。主介面上可以放置供所有介面視圖使用的公用的UI Element (如:Toolbar)。和顯示使用者介面的WorkSpace。WorkItem是封裝了用例實現的容器,容器中的對象可以共用資訊。WorkItem也可以包含下級WorkItem. 由於CAB的優點之一是能夠很好的支援模組化開發,業務開發人員可以專註於某一方面業務模組的開發,如:倉庫管理系統中,入庫和出庫就是同一個系統中的兩個業務點,在CAB的支援下,完全可以將這兩個業務點交由不同的開發人員進行開發,只要按照同樣的既定的規範開發(介面規範,介面規範等),就能很好地進行整合。CAB中通過Module很好的實現了這一點。 一般我們將module實現於dll檔案中,每個Dll檔案可能包含系統某一方面的功能,當我們在獨立開發好各個Module之後,我們可以利用CAB有選擇的載入這些功能模組,從而支援系統運行。要實現Module被載入很簡單,只需要在ProfileCatalog.xml中將需要被載入的module配置進去就可以了。當然前提是被載入的模組需要符合CAB的Module設計的標準。中所示,這個dll中需要有一個繼承自ModuleInit的類,Module被載入的時候,該類的Load方法將被調用,所以大家也可以在繼承類中通過重載Load方法來擴充其載入時的行為。 一般情況下,在獨立的模組中,我們還需要實現相應的繼承WorkItem的類來實現其業務用例的封裝,這個WorkItem我們需要將其添加到RootWorkItem的WorkItems集合中,以便和其建立聯絡。 在WorkItem中可以使用MVP的模式來實現我們的系統。中的View是在主表單的WorkSpace中顯示的和使用者進行互動的介面,Presenter則是響應介面操作,處理商務邏輯的地方,Model則是我們的資料。 雖然我們的系統可以模組化的獨立開發,各個模組之間實現了松耦合,但是系統運行時,CAB還是需要通過某種方式將各個模組糅合在一起,以便形成一個有機的整體。首先CAB是一個IOC的容器,它可以在運行時根據需要執行個體化各種對象,並將其注入到對其有需要的對象中,達到對象的組裝,然後可以通過發布訂閱事件系統及共用State實現了對象間的通訊。 CAB涉及的Dll有: 常用的命名空間如下:
附兩張CAB中命名空間Microsoft.Practices.CompositeUI和Microsoft.Practices.CompositeUI.Winforms涉及的類和介面:
2, MdiWorkspace 該WorkSpace是在WindowWorkSpace的基礎上發展而來的,他同樣將一個使用者控制項在單獨的Form中進行顯示,並且,他還將以MDI的形式顯示和管理其子表單。對應使用者控制項的顯示資訊的設定是通過設定smartPartInfo,然後作為參數傳入WorkSpace的Show方法。 3, TabWorkspace 該WorkSpace能將你需要在其中顯示的使用者控制項以Tab頁的形式顯示出來,我們可以通過和該WorkSpace對應的TabSmartPartInfo來設定使用者控制項的顯示內容,如標題資訊。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/mattwin/archive/2008/04/26/2333507.aspx 4, DeckWorkspace 該WorkSpace將以類似於重疊的卡片的形式來顯示使用者控制項,當前啟用的介面將在卡片的最上方。卡片的數序是由Workspace進行管理。沒有和該WorkSpace對應的SmartPartinfo. 5, ZoneWorkspace 該WorkSpace將以平鋪的方式顯示使用者控制項,比如類似OutLook的介面,可以將一個介面劃分成多個Zone,每個Zone都是作為呈現使用者控制項的一個容器。同樣的,我們可以通過設定ZoneSmartPartInfo來設定使用者控制項在WorkSpace中的顯示內容。
6,Composite UI Application Block (CAB) WorkItem介紹前面已經說到,CAB架構中除了提供了強大的支援功能,如依賴注入,事件機制,介面組合顯示…,還有一個專門封裝商務邏輯的WorkItem。公司專屬應用程式系統其實主要就是企業業務的自動化實現,一個應用程式框架提供的支援功能都只是為了更好地為商務服務。下面就來看看CAB中的WorkItem是如何封裝業務用例的。首先看看WorkItem都包含哪些元素? 從WorkItem的屬性列表中我們可以看出,WorkItem中支援命令和事件,同時WorkItem可以嵌套,通過Parent進行關聯,通過RootWorkItem可以擷取頂層WorkItem,開發人員可以利用這一特性來組織自己業務用例和劃分業務用例的粒度。WorkItem中使用State來共用資訊,在同一個WorkItem容器中的對象可以共用訪問這個資訊。 WorkItem容器中的對象對其中的Service都可以訪問。
WorkItem通過調用Run方法進行啟動,調用這個方法的時候會調用他的OnRunStarted方法,一般我們自訂了一個WorkItem,如果有需要可以重載其OnRunStarted方法來自訂其啟動邏輯。Run方法調用後會觸發RunStarted事件。 一般我們會藉助WorkItem提供的特性,採用MVC的模式進行業務用例的封裝。使用SmartPart作為使用者互動的UI顯示部分(View),建立一個控制類來進行商務邏輯的封裝(Controller),然後將業務資料存放於記憶體實體中(Model)。使用者介面和記憶體實體採用綁定的方式關聯起來。 MVC模式的應用,我們來看看他的初始化和使用者互動過程中的操作是如何進行的? 初始化: 1,應用系統載入WorkItem,WorkItem將使用者介面在WorkSpace中進行顯示 2,使用者介面載入,調用控制邏輯進行初始資料的處理和擷取 3,控制邏輯擷取初始資料 4,控制邏輯將資料存放於記憶體實體中 5,控制邏輯將資料與使用者介面進行綁定,介面會自動根據繫結資料源進行初始化顯示 使用者互動: 1,使用者操作使用者介面,調用相應控制邏輯 2,控制邏輯進行業務處理,進行相關服務或資料庫訪問 3,控制邏輯修改記憶體實體中的資料 4,由於資料與介面綁定,資料的變化直接反應到介面顯示。
個人認為,CAB是的不錯的WinForm應用程式框架,目前主要還是體現在對介面層和商務邏輯層的支援上。如果配合其他的技術架構如Nhibernate對資料庫層進行支援,將會更好。 4,Composite UI Application Block (CAB) FormShellApplication介紹 現在我們來看看基於CAB的應用程式中非常重要的一個類。這個類可以認為是一個CAB應用的啟動點。他就是FormShellApplication。 FormShellApplication的繼承關係如下: 該類需要傳入兩個型別參數,一個是繼承自WorkItem的類(如果不需要通過重載WorkItem的OnRunStarted方法來實現更多處理,這裡可以直接使用WorkItem),一個是繼承自Form的表單。
public class Program:FormShellApplication<MyWorkItem,ShellForm> 通常我們在Main方法中調用其Run方法,執行Run方法會初始化許多應用程式資訊。可以通過override來重寫或增加FormShellApplication的方法處理。 FormShellApplication的初始化包括(可以通過子類重載FormShellApplication的相關方法來判斷其執行順序)以下步驟: 1. RegisterUnhandledExceptionHandler 2. 建立 Build strategies 3. 建立頂級 WorkItem 4. 建立和初始化 Visualizer 5. 添加 services 6.建立Shell
CAB提供的標準服務如下,開發人員可以在此基礎上進行擴充: ü SimpleWorkItemActivationService ü FileCatalogModuleEnumerator ü WindowsPrincipalAuthenticationService ü ModuleLoaderService ü DataProtectionCryptographyService ü TraceSourceCatalogService ü CommandAdapterMapService ü WorkItemExtensionService ü WorkItemTypeCatalogService ü ControlActivationService 執行了FormShellApplication的子類的Run方法,一個CAB應用程式就算是啟動了。隨後就是根據自己的需要來執行WorkItem了。 5,Composite UI Application Block (CAB) WorkSpace介紹 通過前面的介紹我們可以知道在靜態Main方法中執行繼承自FormShellApplication的對象執行個體可以進行很多架構的初始化工作,如載入模組,載入服務等。從FormShellApplication的類型定義中: 通過前面的介紹我們可以知道在靜態Main方法中執行繼承自FormShellApplication的對象執行個體可以進行很多架構的初始化工作,如載入模組,載入服務等。從FormShellApplication的類型定義中: public abstract class FormShellApplication<TWorkItem,TShell> : WindowsFormsApplication<TWorkItem,TShell> where TWorkItem : WorkItem where TShell : Form 可以看到,需要兩個型別參數,一個是WorkItem,一個是Form,FormShellApplication在進行初始化工作的時候會對這兩個類型進行執行個體化。並且會將Form類型的執行個體 Show出來。這裡的Form類型的執行個體即是我們應用程式的主介面。 主介面將是使用者與系統的主要互動地區。他將做為一個容器,承載其他的業務介面。 CAB中提供了WorkSpace組件,他作為使用者控制項和SmartPart控制項的顯示容器,可以以各種各樣的統一的顯示方式呈現業務介面。也就是說WorkSpace可以以不同的風格呈現其中的使用者控制項。WorkSpace支援顯示,隱藏,啟用和關閉其中的使用者控制項。當然,CAB目前提供了幾種預設的顯示風格,接下來我們將一個一個介紹,如果開發人員覺得這些顯示風格還不夠用,當然也可以自己進行擴充。 所有類型的WorkSpace都是實現了介面IWorkSpace的。 目前CAB提供的WorkSpace有: WindowWorkspace MdiWorkspace TabWorkspace DeckWorkspace ZoneWorkspace 下面就來說說每種WorkSpace的特點: 1, WindowWorkSpace 該WorkSpace能將你需要在其中顯示的使用者控制項在一個WinForm中顯示出來,我們可以通過和該WorkSpace對應的WindowSmartPartInfo來設定使用者控制項的顯示內容,如標題資訊,是否是強制回應視窗等。
|