Prism4文档翻译(第四章 第二部分)
??? 這一部分內容有點少呃,而且翻譯難度也有一些大。接下來明天或者后天就把代碼的那部分(第四章 第三部分)放上來吧,最近在弄一個設計忙的要死。另外,由于最近在公司擔任了一大部分的培訓任務(我感覺我就是標準的半桶水叮當響,外加誤人子弟)于是我感覺好像去做這一行也不錯呃。另外有同事要我出視頻,我也就試著做一做吧,正好,附錄H算是和我說bye-bye了,于是補起。對于這種視頻神馬的有誰有做過,可以指點我一下哈。小璽子在此拜謝。
??? 本節導讀:
??? 本節只有一節關鍵決策,在本節中您將會了解進行模塊化應用程序開發前要進行何種準備工作。主要包含了如果將劃分模塊,如果將模塊分配到程序集中,以及在Silverlight中的如何將程序集分配到xap文件中去。最后,通過一個實例說明了模塊間是如何通過接口(可能是在共享庫中的)達到松耦合連接。
??? 在本章翻譯完后,我會在本章最后一部分補上全部的導讀。
?
4.3 關鍵決策
你需要做的第一個決定就是你是否要使用模塊化的解決方案。模塊化應用程序的優勢都已經在上文中講述了,但是在得到這些好處前,也必需付出一些東西。如果你選擇開發一個模塊化解決方案,那么以下內容是需要考慮的:
l 確定你需要使用哪個框架,你可以構建你自己的模塊化框架,使用Prism,MEF,或者其它框架。
l 確定如何組織你的解決方案,確定模塊的邊界以實現模塊化結構。哪些模塊應該包含在哪些程序集中。你可以使用模塊化開發來簡化開發過程,比如控制應用程序是如何部署的或者是否支持插件開發的擴展結構。
l 確實如何分割模塊,模塊可以根據需要進行分割,比如,包含功能區,提供者模塊,開發團隊和部署需求。
l 確定整個應用程序所有模塊都需要使用的核心模塊,核心服務的例子有錯誤報告,驗證和授權服務等。
l 如果你使用Prism,確定選擇向模塊列表注冊模塊的方法,在WPF中,你可以通過代碼,XAML,配置文件,目錄掃描的方法。在Silverlight中,可以使用代碼和XAML文件的形式注冊。
l 確定模塊間的通信方法和依賴策略,模塊間需要互相通信,并且你需要處理模塊間的依賴關系。
l 確定你所要使用依賴注入容器,通常來說,模塊化系統開發需要使用依賴注入,控制反轉(IoC),或者服務定位器(Service Locator)來保持松耦合關系,動態載入和創建模塊。Prism支持使用Unity,MEF和其它依賴注入容器,并且向基于Unity和MEF的應用程序提供支持庫。
l 最小化應用程序時間,考慮使用模塊的使用時加載或者后臺下載來最小化啟動時間。
l 確定部署要求,你也需要考慮打算如何部署應用程序。它會影響放入XAP文件中的程序集的數量。你可能也需要劃分類似Prism庫的共享庫以利用Silverlight的程序集緩存。
下文將會說明這些決策的實現細節。
4.3.1 將應用程序劃分為模塊
當你以模塊化的形式開發應用程序時,會將應用程序組織為若干可以獨立開發,測試和部署的客戶端模塊。每個模塊都會封裝應用程序所有功能中的一部分。你需要做出的第一個設計決策就是如何將應用程序分解到多個離散的模塊中去。
每個模塊都應該包含一系列相關的關注點并且有負有不同的責任。一個模塊可以表示應用程序的垂直切片(vertical slice of application)或者水平服務分層(horizontal service layer)。大型應用程序可能同時擁有這兩種類型的模塊。
一個以垂直切片形式組織的應用程序
一個以水平分層形式組織的應用程序
一個大型應用程序中包含的模塊的組織方式可能包含以垂直切片方式和水平分層兩種形式。它們可能包含以下模塊:
l 包含特定功能的模塊,如在the Stock Trader Reference Implementation (Stock Trader RI)中的新聞模塊。
l 包含子系統或者相關用戶用例的模塊,比如采購,開發票,做總賬。
l 包含了系統的基礎服務,比如日志,緩存,授權服務,或者web service。
l 包含調用其它業務支撐系統的服務,比如客戶關系管理和企業信息管理,和除此本身之外的其它內部系統。
模塊間的依賴關系應該最小化。當一個模塊依賴于其它模塊時,它們之間應該是通過位于共享庫的接口進行松耦合,而不是使用具體的類,通過EventAggregator事件類型于其它模塊通信。
4.3.2 將模塊分配到項目中去
模塊有許多種創建和封裝的方法。最常用也是推薦的方法是將每個模塊都分配到獨立的程序集中。這樣有助于保證模塊間的邏輯隔離也提高了封裝性。同樣也可以就和如何部署模塊一樣方便的區分模塊的邊界。當然,一個程序集包含多個模塊也未嘗不可,在一些情況下,它還有助于減少解決方案中的項目數量。在一些大型應用程序中,包含10-50個模塊也沒什么不正常的。這時,將每個模塊分配到一個獨立項目中然后再全部加到解決方案中去就會影響Visual Studio的性能。一些情況下,如果你堅持將每個模塊都分配到獨立的程序集或者Visual Studio項目中去,那就可以考慮打散一些模塊或者將一些模塊放到一個獨立的解決方案中去管理。
4.3.3 XAP和模塊分解
在Silverlight應用程序中,每個模塊通常都放到獨立的xap文件中去,當然在一些情況下,也可能在一個xap文件中封裝多個模塊。你應該考慮應用程序啟動或者一個新功能加載時需要多少xap文件支持以保證每次的下載量最少。如果你選擇將每個模塊都分到獨立的項目/程序集,那就需要決定部署時每個xap文件中所包含的程序集數目。
以下是一些將會影響每個xap集中的程序集數量的因數:
l 下載大小和共享依賴,每個xap文件都有一些額外信息比如mainfest(文件列表)和.zip文件封包內容。當然,如果有一些無法的依賴模塊或者緩沖庫的話,那么每個xap文件中也可能包含這些依賴庫,這些都會增加需要下載文件大小。
l 模塊被應用程序調用的時機,如果多個模塊在同一時間被應用程序調用,比如在應用程序開始的時候顯示視圖,那么將它們封裝在同一個xap文件里以保證它們能夠更快的被下載,也保證它們可以在同一時間被應用程序使用。Prism的模塊化功能可以保證所有依賴即使在不同的xap文件中也可以以一個正確的順序被加載。但是就算是在下載大小完全相同的情況下,下載一個文件的性能總是比下載兩個文件要好一些。
l 模塊版本,如果不同的模塊會在不同的時間點被開發和獨立的部署,你肯定會將它們放到不同的xap文件中所以使用模塊版本劃分會更加清晰,也有助于獨立的升級。
為了防止同一個模塊在不同的xap文件被下載多次,可以使用以下兩種途徑:
l 將共享依賴分配到一個獨立的基礎模塊中去,并且讓其它模塊都依賴于它。
l 使用Silverlight的Assembly Library Caching將通用類型放到一個共享庫中,這樣它就會下載一次并且被Silverlight緩沖而不是Prism的模塊下載器緩沖。
4.3.4 使用依賴注入保證松耦合
模塊可能依賴于宿主應用程序或者其它模塊提供的組件和服務。Prism擁有模塊間的組件注冊依賴的能力以便他們可以以一個正確的順序初始化。Prism也支持模塊在載入應用程序時初始化。在模塊初始化時,模塊將會檢索自己所需要的額外組件和額外服務,和/或向容器注冊組件和服務以便于其它模塊調用。
依賴注入的例子
在這個例子中,OrdersModule程序集定義了OdersRespository類(同其它視圖和接口一起實現訂單的功能)。CustomersModule程序集定義了一個依賴于OdersRespository的CustomersViewModel 類,通常依賴是基于一個服務公開的接口。應用程序啟動和初始化過程將包含以下過程:
1、啟動器開始模塊初始化過程,模塊加載器加載并初始化OrdersModule。
2、在初始化OrdersModule時,向容器注冊OdersRespository。
3、接下來模塊加載器加載CustomersModule,模塊啟動順序可以由模塊元數據中的加載關系所指定。
4、CustomersModule由容器解析以初始化一個CustomersViewModel的實例。而CustomersViewModel有一個通過構造函數注入或者屬性注入的基于OdersRespository(通常是通過它的接口)的依賴。于是OrdersModule中注冊的實際類型就被容器當作依賴注入到視圖模型中。連接的結果就是CustomersViewModel和OdersRespository在沒有通過緊耦合連接的情況下通過接口引用了。
【注意】:用于暴露OrderRespository (IOrderRepository)的接口可以存在于一個只包含用以提供這些服務的接口的“共享服務”程序集或者 “訂單服務”程序集中。這樣CustomersViewModel和OdersRespository之間就不存在強依賴的關系了。
注意,所有模塊與依賴注入容器有隱式依賴關系。該依賴在模塊初始化時就被模塊加載器注入。
轉載于:https://www.cnblogs.com/Pray4U/archive/2011/11/30/2269240.html
總結
以上是生活随笔為你收集整理的Prism4文档翻译(第四章 第二部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于脚本log返回乱码解决方法
- 下一篇: C语言中的位域 bit field [转