Prism4文档翻译(第四章 第一部分) 转载bluesky234
第四章 模塊化應用程序開發
模塊化應用程序指的是將一個應用程序劃分成若干個可以組合的功能單元。一個模塊封裝了應用程序的一部分,并且通常是一系列相關的關注點。他們包含了含有用戶界面和業務邏輯相關組件的集合,比如應用程序的某些功能,或者是一些系統基礎模塊,比如應用程序級的日志系統或者用戶認證系統。模塊之間相對獨立但又可以通過松耦合手段進行通信。模塊化應用程序可以使開發,測試,部署或者擴展應用程序變的更加方便。
舉例來說,考慮一個個人銀行。用戶可以使用各種各樣的功能,比如轉賬,付款,或者從他們的個人UI中更新個人信息。然而,這些功能都是封裝到各個獨立的模塊中。這些模塊互相之間使用如數據庫或者web service等后端系統進行通信。應用程序服務將這些模塊整合到一起并且提交用戶交互內容。用戶看起來就好像這是一個應用程序一樣。
下圖描述了多模塊應用程序的設計思想:
?
4.1 構建多模塊應用程序的好處
你可以已經使用類,接口,程序集來搭建一個結構優良的應用程序,并且它很好的體現了OO的設計原則。即便如此,除非特別注意,你的應用程序還是設計成為“一整塊”(因為所有功能都是使用緊耦合的方式實現的),這樣會使應用程序難以部署,開發,擴展,測試和維護。
從另一方面說,而應用程序模塊化能夠幫助你識別大的功能區并且可以將其分開開發和測試。這樣的方式可以簡化開發和測試的過程,而且也可以讓你的應用程序更加靈活,在將來也可以更方便的擴展。
4.1.1 Prism為模塊化開發所提供的內容
Prism為模塊化應用程序開發和運行時模塊管理提供支持。使用Prism的模塊化開發功能可以幫助你節省測試和實現你自己的模塊化框架的時間。Prism提供了以下的模塊化開發功能:
l? 注冊和定位模塊的模塊列表,模塊列表可以通過以下途徑創建:
u? 在模塊中定義或者在XAML文件中定義
u? 在WPF:在同一目錄中自動發現所有模塊,而不需要集中的逐一定義。(澤注:應該說的是MEF方式)
u? 在WPF:使用配置文件定義
l? 定義模塊的元數據屬性以說明初始化方式和依賴關系
l? 與依賴注入容器集成以支持模塊間以松耦合關系連接
l? 在模塊讀取時:
u? 依賴管理,包含了二次(duplicate)和循環檢測以保證每個模塊以正確的方式加載,并且只加載一次
u? 通過需要時加載和后臺下載的方式最小化程序載入時間;也就是說一些模塊可以在需要的時候在后臺加載和初始化
4.2 關鍵概念
本節介紹了與Prism模塊化開發有關的關鍵概念,包括IModule接口,模塊加載過程,模塊列表,模塊間通信,和依賴注入容器。
4.2.1 IModule:模塊化應用程序的構建者
一個模塊是一系列包裝在一起并且可以獨立開發,測試,部署,和集成到應用程序的功能和資源的集合。這個包可以是在XAP文件中的一個或多個程序集,他們可能是一個松散集合,也可能是集中放置。每個模塊都有一個樞紐類以負責初始化和將本身的功能與應用程序集合,這個類會實現IModule接口。一個包中只要有一個實現IModule接口的類就足以判定這是一個模塊。IModule接口只有一個稱為Initialize的方法,通過該方法,可以定義任何需要添加到應用程序中的邏輯和功能。根據模塊的功能,將視圖注冊到復雜UI中,添加應用程序需要使用的服務,或者擴展應用程序現有功能。以下是一個定義一個模塊最基本的代碼。
1 public class MyModule : IModule2 {
3 public void Initialize()
4 {
5 // Do something here.
6 }
7 } 復制代碼
?
【注意】:除了使用IModule接口提供的Initialize方法,the Stock Trader RI使用了一種基于屬性的定義法來注冊視圖,服務,和類型。
4.2.2 模塊生命周期
在Prism中,模塊以以下方法初始化:
l? 模塊注冊/發現,模塊在特定應用程序的模塊列表中在運行時加載。該列表說明了模塊是否需要加載,它們的位置,以及以何種程序被加載。
l? 加載模塊,模塊所在的程序集被載入內存。這一階段使模塊通過網站,其它遠程連接手段或者直接在本地文件中發現的途徑被下載。
l? 初始化模塊,下載后,模塊被初始化。也就是產生一個實例并且通IModule接口提供的Initialize方法初始化。
下圖說明了模塊的加載過程。
?
4.2.2 模塊列表
ModuleCategory提供了應用程序所需要的模塊信息。其本質是ModuleInfo類的集合。每個模塊的名字,類型,位置,和其它模塊中的屬性信息都在ModuleInfo描述和記錄。以下是上些通過ModuleInfo實例生成ModuleCategory的典型方法:
l? 在代碼中注冊
l? 在XAML中注冊
l? 使用配置文件注冊(只有在WPF中可以)
l? 通過本地目錄自動發現(只有在WPF中可以)
你可以根據應用程序的需要選擇發現或者注冊機制。通過配置文件或者XAML可以讓你不需要在項目中引用模塊。使用目錄自動發現則不需要將它們在某個文件中特別定義。
4.2.3 控制模塊加載
Prism應用程序可以盡早加載模塊,也就是所謂的“可用時加載”,或者當應用程序需要它們的時候加載,也就是所謂的“使用時加載”。在Silverlight應用程序中,模塊可以應用程序一起下載,或者在應用程序啟動后在必要時再下載。模塊加載過程請參考如下內容:
l? 模塊如果是應用程序執行必備的,那么,必須同應用程序一同下載并且在運行時被初始化
l? 如果模塊包含了應用程序的常用功能,那么就可以在即將需要它的時候通過后臺下載的方式加載(澤注:這種就是上文所述的“可用時加載”)
l? 如果模塊所包含的功能并不常使用(或者提供的功能不是其它模塊所必需的)就可以選擇在需要時加載
4.2.4 模塊與應用程序的整合
Prism提供了以下兩個類負責應用程序啟動過程:UnityBootstrapper和MefBootstrapper。這些類用以創建和配置模塊的發現和加載的管理。你可以通過幾行代碼重寫配置方法以通過XAML文件,配置文件,本地目錄的形式加載模塊。
模塊通過的Initalize方法與應用程序的其它部分整合。初始化的方法是多樣的,它取決與你應用程序的結構和模塊的內容。以下的內容是一般模塊整合進應用程序中必做的事:
l? 將模塊的視圖都添加到應用程序的導航結構中,這是使用視圖發現或者視圖注入構建復雜UI通常要做的事
l? 訂閱應用程序級的事件或者服務
l? 向應用程序的依賴注入容器注入共享的服務
4.2.5 模塊間通信
即使模塊間是松耦合關系,但是模塊間通信還是必不可少的。通信的方式有多種,每種方式都有其獨特的優勢。通常,解決方案中使用的會是這些方式的組合。以下說明了一些通信方式:
l? 松耦合事件,模塊可以告知某個事件已經發生。其它模塊可以訂閱這些事件以保證在事件發生時,它們會收到通知。松耦合事件是建立兩個模塊通信的輕量級方法;因而,它很容易實現。但是一個過于依賴事件的設計會很難維護,由其是那些為了實現一個目標而安排的事件。在這種情況下,應該考慮共享服務。
l? 共享服務,?????? 共享服務是一個可以通過通用接口訪問的類。通常,共享服務是在公用程序集中定義,并且提供了系統層的服務,例如,用戶認證,日志或者配置。
l? 共享資源,如果你不想讓兩個模塊直接通信,那么也可以通過共享資源來間接通信,比如數據庫或者一些web service。
4.2.5 依賴注入和模塊化應用程序
容器,比如Unity(Unity Application Block)和MEF(Managed Extensibility Framework),可以讓你方便的使用控制反轉(Inversion of Control,IoC)和依賴注入,它們都是設計模塊的強力設計模式。它們可以讓模塊在不通過復雜代碼說明引用的情況下獲得這些引用關系。以此來提供代碼的靈活性和可重用性。依賴注入在構建松耦合模塊化應用程序中非常常用。Prism本身對構成應用程序和組件的依賴注入容器是不可知的。依賴注入容器的選擇最大程序取決于你應用程序的需求。不過Microsoft也推薦了兩款主打依賴注入框架——Unity和MEF。
patterns & practices Unity Application Block提供了一個完整的依賴注入容器所必要的內容。它提供了屬性注入,構造函數注入和函數注入以供顯示的向模塊注入所需要的內容。它也提供了許多其它典型依賴注入容器所有的功能。
MEF(它也是.NET Framework 4和Silverlight 4的組成部分)通過提供基于依賴注入的模塊來保證.NET程序的可擴展性,并且提供其它模塊化應用程序開發所需要的功能。它使得應用程序可以在運行時發現模塊并且以松耦合的方式整合到應用程序中。MEF是一個有良好擴展性和構建可能的框架,它包含了程序集和類的發掘,類的依賴分析,依賴注入,一些不錯的程序集,和XAP下載性能。Prism提供了所有MEF的優點,如下文所述:
l? 將模塊中的類與XAP位置進行關聯
l? 在WPF或者Silverlight中通過XAML或者屬性方式注冊模塊
l? 在WPF中通過配置文件或者目錄掃描的方式注冊模塊
l? 模塊加載時的狀態跟蹤
l? 在使用MEF時的自定義模塊元數據
當然,Unity與MEF都可以與Prism無縫連接。
轉載于:https://www.cnblogs.com/nnkook/articles/2282708.html
總結
以上是生活随笔為你收集整理的Prism4文档翻译(第四章 第一部分) 转载bluesky234的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RichTextBox的使用
- 下一篇: 【转】asp.net中@page指令的属