使用 SailingEase WinForm 框架構建復合式應用程序(插件式應用程序)


SailingEase WinForm Framework WinForm開發框架開發手冊:http://docs.shengxunwei.com/Home/Browser/sewinformfw/

 

 

    對於一些較小的項目,具備一定經驗的開發人員應該能夠設計和構建出便於進行維護和擴展的應用程序。但是,隨着功能模塊數量(以及開發維護這些部件的人員)的不斷增加,對項目實施控制的難度開始呈指數級增長。

      SailingEase WinForm 框架為您提供了針對此問題提出的解決方案。在本文中,將對基於SailingEase WinForm 框架的復合應用程序的定義進行解釋,並簡要說明如何才能構建一個基於 SailingEase WinForm 框架功能的復合應用程序。

 

      傳統的單一應用程序

      傳統的單一應用程序每個控件都緊密耦合在一起,UI 中存在大量用於協調各個部分的邏輯。控件之間還存在着相互依賴關系。

      由於存在這些依賴關系,因此無法通過某種簡單的方法將應用程序分解成可在其中分別開發各個不同部分的窗體。雖然可以將所有用戶控件都放在一個單獨的程序集中以提高可維護性,但這種做法只是將問題從主應用程序轉移到了控件程序集,治標不治本。在這種模型中,進行重大更改或引入新功能都非常困難。

 

      基於 SailingEase WinForm 框架的復合應用程序(插件式應用程序)

      基於 SailingEase WinForm 框架的復合應用程序由運行時動態發現和構成的松散耦合模塊組成。模塊包含代表系統的不同垂直片段的可視和非可視組件。可視組件(視圖)被組合在一個常規外殼中,可用作應用程序所有內容的宿主。復合應用程序可提供各種服務,將這些模塊級組件結合在一起。模塊可提供與應用程序的特定功能相關的其他服務。

      從較高的層次來看,復合應用程序是“復合視圖”設計模式的實現,此模式可描述包含子項的視圖的遞歸 UI 結構,這些子項本身也是視圖。這些視圖然后通過某種機制組合起來 — 通常是在運行時而非設計時靜態組合。

      模塊會影響在其中創建主復合視圖(也稱為外殼)的視圖。模塊永遠不會相互直接引用,也不會直接引用外殼。相反,它們會利用服務在彼此之間以及與外殼之間進行通信,以響應用戶操作。

      使用模塊來組成系統有很多好處。模塊可聚合來自同一應用程序中不同后端系統的數據。此外,系統可隨着時間的推移更加方便地發展演變。在系統需求發生變化而需要向系統中添加新模塊時,與非模塊化系統相比,模塊化系統面臨的沖突要少很多。而且還可以對現有模塊進行獨立性更強的改進,從而改善可測試性。最后,模塊可由不同的團隊開發、測試和維護。

一個典型的基於 SailingEase WinForm框架的應用程序

 

   

      創建基於 SailingEase WinForm 框架的應用程序

      引導程序和容器

      使用 SailingEase WinForm 框架構建復合應用程序時,首先必須初始化幾個核心復合服務。這就引入了引導程序。它可以執行發生復合所需的全部功能。在許多方面,它都類似於應用程序的 Main 方法。

      對於容器,指的是控制反轉 (IoC) 容器/依賴關系注入 (DI) 容器。容器在應用程序中起着關鍵作用。容器存儲着應用程序中使用的所有應用程序服務。它負責在需要的位置注入這些服務。

      在配置容器的同時,還會自動注冊幾個核心服務(如事件聚合器),基本的引導程序允許您覆蓋其中的任何服務。例如,自動注冊 ImoduleLoader 服務。如果在引導程序中覆蓋 ConfigureContainer 方法,即可注冊自己的模塊加載程序。

 

      模塊的加載

      在引導程序中,通過覆蓋方法 GetModuleCatalog 即可加載所需的模塊,除了通過 ModuleCatalog 的 AddModule 方法來加載模塊之外,可以在此實現其它任何所需的模塊加載方式。

 

      定義並實現一個模塊

      在基於 SailingEase WinForm框架的應用程序中,模塊是復合應用程序的分離單位,可將其部署為單獨的程序集(盡管並非必需)。模塊包含了大部分的功能。

      這是一個基於 SailingEase WinForm框架的應用中的一個模塊,StartPageModule.cs是實現 IModule 接口的類。此接口僅包含一個方法,稱為 Initialize。如果把引導程序看作應用程序的 Main 方法,那么此處的 Initialize 方法就是模塊的 Main。

      在該模塊的構造函數中,我們取得 IUnityContainer 容器,事件聚合器 IEventAggregator ,以及工作區服務 IWorkbenchService。

      IUnityContainer,IEventAggregator和IWorkbenchService它們究竟從何而來?我是否要將邏輯硬編碼到模塊的初始化代碼中?

      答案是“否”。加載模塊時,SailingEase WinForm框架自動將模塊需要的服務從容器中解析出來,注入到模塊的構造函數中,如果我們需要在模塊初始化時獲得其它服務,只需在構造函數中直接加入參數即可。

      在該模塊的 Initialize 方法中,我們做了兩件事:注冊導航項到應用程序的外殼口)中,訂閱應用程序中的事件。

 

      在不同的模塊間發布/訂閱事件

      SailingEase WinForm 框架為您提供了事件聚合服務,在傳統的單一應用中,不同功能點之間的事件訂閱是直接的引用與依賴關系,而SailingEase WinForm 框架通過事件聚合服務,使得事件的訂閱者,與發布者完全解耦合,不存在任何引用與依賴關系。

      傳統的應用程序事件發布訂閱:

      功能A發布事件 ProjectOpenedEvent ,功能B訂閱此事件時,必須在編碼過程中依賴,引用功能A的程序集或者類。

      基於 SailingEase WinForm 框架的事件發布訂閱:

      模塊B獲得事件聚合服務,向事件聚合器訂閱事件 ProjectOpenedEvent,當有其它事件發布者,如模塊A,向事件聚合器發布事件 ProjectOpenedEvent時,模塊B將得到通知從而執行相關代碼。

      模塊A與模塊B,或更多的此事件訂閱、發布者,不存在任何依賴,引用關系,它們通過事件聚合服務發布,訂閱事件。

      例如我們上文中的 StartPageModule 訂閱了兩個事件,ApplicationRunEvent 和 ProjectOpenedEvent。

      我們的 StartPageModule 無需關心誰是事件 ApplicationRunEvent 和 ProjectOpenedEvent 的發布者,也無需關系發布者將在什么情況下,什么時間發布這兩個事件,StartPageModule 只需做好響應這兩個事件的准備即可。

      而我們的事件發布者,也無需關心誰是事件的訂閱者,只需在應該發布事件的時候,向事件聚合器發布對應的事件即可。

      下面的代碼發布了事件 ApplicationRunEvent。

      通過事件聚合機制,模塊間的事件發布,響應實現了完全的解耦合,模塊與模塊間不存在任何引用,依賴的關系。即使將某個事件的訂閱者模塊或發布者模塊暫時的移出系統,其它模塊都不會受到影響。

 

      通過服務在不同的模塊間交互數據或調用功能

      在過去單一式應用程序中,當不同的功能點間需要交互數據或存在功能調用時,通常在編碼時就將它們放在一起,有經驗的程序員或許會將不同的功能點放在不同的程序集中,但依然避免不了程序集間互相引用所造成的高度耦合與依賴。

      在 SailingEase WinForm 框架中,通過服務的概念來解決模塊間作問題,使模塊間不存在任何依賴與引用。

      通過一個簡單的例子就能了解,例如我們的模塊A提供了客戶的基本信息管理功能,而模塊B專門用於處理與客戶的聯系記錄。如何在模塊A中需要列出指定客戶的聯系記錄?

我們為客戶聯系記錄管理模塊(模塊B)設計一個服務接口 ICustomerContactService,我們將該接口定義在一個所有模塊都已知的基礎程序集 Infrastructure 中,然后我們在模塊B中實現此接口,實現接口中定義的用於提供聯系記錄信息的方法,並將實現后的服務注冊到 SailingEase WinForm 框架的服務容器中。

      模塊A在需要列出客戶的聯系記錄信息時,只需從服務容器中取出 ICustomerContactService,即可通過該接口調用其所提供的方法獲取信息,而不必關系接口的實現者與提供者是誰。

 

      SailingEase WinForm 框架為您實現了許多用於開發基於.NET 平台的 Windows應用程序所需的服務,如多文檔窗口管理,上下文菜單管理,系統環境相關的服務等等。基於這些服務,您將輕易獲得質量可靠,擴展性強,低耦合度可配置化的專業Windows應用程序。

   

 

豐富的控件包

         WinForm 控件開發一直是基於.NET Windows應用程序開發的難點之一,開發人員水平的參差不齊,Web的流行,使企業或開發團隊想找到精於WinForm控件開發的人才非常困難,我們的團隊在人才招募時,精通GDI+的.NET開發人員很難遇到。而我們的SailingEase WinForm開發框架為您提供了最常用也最實用的控件包: 如 DataGridView美化,ComboBox 美化以及專門開發的用於復雜情況的 ComboBox,用於圖像縮略圖瀏覽的ImageView。

 

         在此向您簡要介紹幾種具有代表性的控件效果和我們實現方法的簡要說明

         DataGridView

         我們為微軟原生 DataGridView 提供了美化和搜索/替換等功能。

         經美化后的DataGridView使您的應用程序具有相當專業水平的視覺效果。此外,我們提供了單元格搜索替換,背景水印文本,帶有禁用效果的CheckBox列,以及通過對象類型或屬性值映射從而顯示不同圖像的Image列。

         部分源代碼結構如下:

         如何根據項目需要調整DataGridView的視覺效果?通過DataGridViewRendererTheme類:

         通過獨立的渲染機制,如何定制您自己的DataGridView視覺效果相信您已一目了然。

         如何為DataGridView 實現搜索/提換功能?如果您想將此功能集成到現有項目中是否需要大幅度更改現有代碼?並不需要,您只需要在您現有的使用 DataGridView的代碼中添加一行代碼:

         DataGridViewSearchPresenter searchPresenter =  new DataGridViewSearchPresenter(dataGridView);

         即可調用 DataGridViewSearchPresenter 中提供的公開方法來實現各種對單元格的搜索替換功能。像這樣在面像對象編程中使用對象復合的方式來提供功能的例子在我們的框架中有許多。

 

         ComboBox

         我們除了提供微軟原生ComboBox的加強版本之外,完全重新實現了一個更加美觀功能更強的ComboBox。

         我們提供的ComboBox除了具有效好的視覺效果,對於開發人員來講,具有極高的擴展性。定制外觀的方式與上文中提到的DataGridView外觀定制方法類似,這里主要講如何擴展ComboBox。首先看一看源代碼結構圖:

         從源代碼結構中可以看出我們的 ComboBox 是一個復合控件,點 ComboBox 時所呈現的列表,使用的是 SEListView來實現的。通過 SEComboSelectorTheme類,您可以定制個性化的視覺效果,而通過 SEListView 提供的 Layout 功能,您可以實現任意效果的下拉列表。這個任意效果的 Layout 實現,到底可以實現什么,我們不妨看一看用於呈現圖像的ImageView控件。

         ImageView 控件本身就是一個 SEListView,但我們為其實現了專門用於呈現圖像的 Layout,在這個復雜的Layout實現中,我們定義了列表項的呈現方式,提供了框選,單選,反選和鍵盤操作功能。如果您希望在ComboBox 展開時呈現圖像縮略圖供用戶選擇,應用這個 Layout 即可。

         使用SEListView 的Layout功能和 Theme功能,幾乎可以實現任意效果和功能的列表。

 

         ExtendedWebBrowser

         即使是Windows應用程序,也許某些情況下也不可避免與Web頁面產生交互。

         此處點擊 Web 頁面中的 “Open Project” 或 “New Project” ,會調用WinForm應用程序中對應的功能。

         將Web頁面集成到您的項目中,除了業務邏輯與其它Web項目可能產生的交互外,使用Web頁面來替代一些Windows界面,不僅美觀,其設計實現的難度比使用GDI+的WinForm 控件要大大降低,您只需要美工設計傳統網頁即可。

 

         AddressBar

         使用類似Windows7的為您的應用程序做導航,不但結構清晰,功能性強,同時也獲得了專業級別的導航效果。

 

         其它典型WinForm控件:

專業標題欄效果

 

菜單,上下文菜單美化

 

命令行效果

 

向導框架

 

         以上列出了部分具有代表性的部分WinForm控件,尚有部分外觀改動較小只是功能性增強的控件沒有列出,我們的控件都經過專業的設計和細致的實現,相信您能夠從我們上文中的源代碼結構和介紹中有所了解,使用 SailingEase WinForm 框架提供的控件,能夠大大提高您的應用程序開發效率和專業化水平,使您的項目團隊在開發WinForm應用時輕松自如。

 

豐富的組件包

         SailingEase WinForm 開發框架提供了大量的功能組件,這些組件可能多數沒有直接反應在項目的用戶界面上,但卻是框架中的重要組成部分,如:基於HTTP的應用程序自動升級更新,AES,DES,MD5加密算法封裝,為提高反射性能的高速緩存,對象屬性值快照/還原功能,Attribute相關功能,對Type)功能的加強,XML、ZIP流/文件包的處理,正則表達式相關功能,TCP通信的封裝實現等等。

         部分源代碼結構:

 

         SailingEase WinForm 框架中所有的組件皆是在多年的項目實踐中提煉完善而來,能夠解決很多WinForm應用程序開發中遇到的問題,能夠提高您的項目開發效率,縮短50%以上的開發周期,極好的節約您的項目成本,而框架本身良好的設計實現,亦能夠大大提升或加強您項目的健壯性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM