從今天起開始寫一個Prism架構的學習部落格,今天是第一篇,是以從最基本的一些概念開始學習這個基于MVVM的架構的學習,首先看一下Prism代表什麼,這裡引用一下比較官方的英文解釋來看一下:Prism was the code name for the guidance formally known as the Composite Application Guidance for WPF and Silverlight. For brevity and conciseness, and due to customer demand, this guidance is now referred to simply as Prism.Prism主要是用來開發具有多界面,豐富使用者互動以及資料可視化特點的WPF以及Sliverlight的應用程式的具體呈現和商業邏輯,具體了解到了其基本概念之後,我們再來學習新的内容。
一 為什麼要使用Prism架構?
在回答這個問題之前,我們不得不了解關于使用WPF或Siverlight開發用戶端程式所面臨的挑戰。
1 我們知道在軟體開發的過程中,應用程式的需求是随着時間的推移發生重大改變的,在這個過程中會面臨技術的不斷更新,并且在開發周期中我們還會遇到使用者的不斷回報,最終導緻使用者需求的不斷變化,是以說在開發一個應用程式中如何建構一個随着時間的推移能夠輕易去修改并且去擴充的應用程式就顯得非常重要了,這甚至需要架構師去建構一個各個部分之間彼此獨立,能夠單獨就行開發和測試,并且能夠順利進行更新和修改的子產品化程式,而且其中的任意一個子產品能夠做到不影響其他的任意一個部分的邏輯功能,這個是非常重要的。
2 另外一方面就是在一個企業級的應用開發可能涉及到多人協作開發,這裡可能涉及到前台UI開發者,背景邏輯實作者,這麼多人大家如何去協作開發,彼此獨立,互不影響,并且最終能夠組合成一個完整的項目,這對程式的開發者提出了一個巨大的挑戰,是以Prism的出現為這些問題提供了一個高效的解決方案。
3 對于一個大的并且耦合度非常高的應用程式,由于程式之間彼此沒有明顯的隔離,是以造成想要給應用程式添加或者更改一些特性變得非常困難,并且在這種系統中,如果想修複程式中其它部分的bug想要不影響整個系統的其它部分,這個是非常重要的。
Prism的出現正是出于解決上面的一些問題,為建構一個:可重複利用的、可擴充的、靈活的、可以團隊開發的、高品質的應用程式提供了一個很好的解決方案。
二 Prism架構中一些非常重要的概念
Modules:Modules是能夠獨立開發、測試、部署的功能單元,Modules可以被設計成實作特定業務邏輯的子產品(如Profile Management),也可以被設計成實作通用基礎設施或服務的子產品 (如Logging、Exception Management)。
Module Catalog:在Prism中,Module Catalog指明了要Load哪些Module,和用什麼樣的順序去Load這些Module。
Shell:Shell是宿主應用程式(host application),modules将會被load到Shell中。Shell定義了應用程式的整體布局和結構,而不關心寄宿其中的Module,Shell通常實作通用的application service和infrastructure,而應用的邏輯則實作在具體的Module中,同時,Shell也提供了應用程式的頂層視窗。
Views:Views是應用中展現特定功能的視圖,它展現UI、定義互動行為,并且通過資料綁定的方式與ViewModel進行互動。
View Model和Presenters:View Model用來封裝應用程式的UI邏輯及其狀态。
Model:Model被用來封裝資料和相應的驗證,以及相關的業務規則來保證資料的一緻性和正确性。
Commands:Command被用來封裝應用程式功能,Prism提供了Delegate Command和CompositeCommand兩個類。
Regions:Regions是應用程式UI的邏輯區域,它很像一個PlaceHolder,Views在Regions中展現,很多種控件可以被用作Region:ContentControl、ItemsControl、ListBox、TabControl。Views能在Regions程式設計或者自動呈現,Prism也提供了Region導航的支援。
Shell、Region和View的關系如圖所示:

Navigation:Prism支援兩種導航:state-based導航和view-switching導航。
EventAggregator:元件通常要和其它的元件或者服務進行通信。為此,Prism提供了EventAggregator元件,這個元件實作pub-sub事件機制,允許一些元件釋出事件,另一些元件去訂閱事件而無需兩個元件之間的引用。
Dependency Injection container:Prism使用依賴注入模式來管理元件之間的依賴,Prism被設計使用Unity、Mef等依賴注入容器。
Services:Services是用來實作非UI相關功能的邏輯,例如logging、exception management、data access。Services可以被定義在應用程式中或者是Module中,Services通常被注冊在依賴注入容器中,使得其它的元件可以很容易的定位這個服務。
Controllers:Controller被用來控制在Region中哪個View将會被呈現,同時控制這個View的建立和初始化。
Bootstrapper:Bootstrapper用來初始化應用程式級别的元件和服務,它也被用來配置和初始化module catalog和Shell 的View和View Model。功能如圖: