Prism簡介

最近公司讓我給其他員工普及一下Prism框架,整理一下資料和思路。于是乎翻譯了一下官方的介紹。

Prism簡介

1.Prism能干嘛

Prism為程序設計提供指導,旨在幫助用戶更加容易的設計和構建豐富、靈活、易于維護WPF桌面應用程序。Prism使用設計模式(如MVVM,復合視圖,事件聚合器),幫助你創建一個松耦合的程序。遵循這些設計模式原則,將目標程序解耦成獨立的模塊。這些類型的應用程序被稱為復合應用程序。

2.什么是復合應用程序

復合應用程序通常包含的功能有:多個屏幕、復雜的用戶交互和數據可視化。這些功能用以體現特定場景和業務邏輯。此類應用程序通常與多個后端系統和服務和交互,使用分層架構,還可能是物理部署到多個層。該類應用程序還在生命周期中預期會有大量的新功能需求和商業機會。簡而言之,就是“長期使用”和“頻繁變更”。如果沒有這種要求,則不應該使用Prism。

3.Prism包含什么

Prism 5目標平臺為.NET 4.5。5版本包含了新的MVVM,navigation,MEF的指導。

開發中遇到的挑戰

通常情況下,客戶端應用程序的開發中會遇到很多的挑戰。

  • 應用程序需求可能隨時間改變
  • 新的商業機會和挑戰可能出現
  • 新技術可能已經變得可用
  • 用戶反饋導致需求變更

因此,構建一個靈活的、易修改、易擴展的應用程序是至關重要的。然而設計這樣一個程序是很難的。它需要一個架構,允許應用程序的各個部分是獨立開發和測試,可以修改或更新后,不影響應用程序的其余部分,相當于是隔離的單獨部分

大多數企業級應用程序都是相當復雜的,以至于需要不止一個開發人員,甚至是一個大型包括UI設計人員和本地化人員的開發團隊。這時,如何設計程序使得多個開發者或者是多個子團隊能夠獨立有效的開發程序子模塊,并且能夠在子模塊完成之后順利無縫集成到應用程序中去,是一個相當大的挑戰。

像電路板一樣去設計和構建應用程序可能會導致應用程序的維護非常困難低效。這里說的“電路板”是指一個應用程序的組件是緊耦合的,它們之間沒有明確的分離。通常,這么玩會把程序員搞到吐。很難將新特性添加到系統或更換現有功能,很難解只修bug而不破壞系統的其他部分,而且很難測試和部署。此外,還影響開發人員和設計人員的合力工作。

復合程序(Composite Applications)

一個行之有效的解決方法是將復雜的程序拆分成許多離散的、松耦合的、半獨立的組件,并且這些組件能夠輕松的在shell中組合成一套解決方案。按這種設計構建的程序通常稱為復合程序。

使用復合程序有如下好處:

  • 允許由不同的個人或團隊進行模塊的單獨開發、測試和部署;更容易被修改或添加新功能,從而使應用程序更易于擴展和維護。注意,獨立開發者也能從復合程序開發中獲得好處,因為能夠創建更易測試、可維護的應用程序使用復合的方法。
  • 提供了一個通用的由許多松耦合的模塊支撐UI組件組成的Shell。減少了多個程序員添加同一個新功能到UI時的沖突,使得程序能夠呈現出一個統一的外觀。
  • 提高了重用性。在代碼邏輯和業務邏輯之間提供了一個干凈的視點。讓你能夠更容易的管理組件之間的依賴關系和交互邏輯。
  • 能夠根據開發者或開發團隊的焦點或專業技能不同,分配不同的任務或功能。特定的說,能夠讓UI和程序的業務邏輯分開。也就是說UI可以更專注的開發豐富的用戶界面。

復合程序特別適合創建各種客戶端程序系列。例如多個后端系統創建多個終端軟件。下圖展示了典型的此類復合程序。


典型示例

在如上圖類型的應用程序中,用戶可以看到豐富并且靈活的界面。以任務為導向,將功能分布在多個后端系統、服務以及數據存儲。這些后端系統、服務以及數據存儲則是由一個或多個專用模塊組成的。清晰分離應用程序邏輯代碼和UI使得組成應用程序的所有模塊都呈現出不同樣子并保持一致的風格。
如果一個符合程序能夠讓不同團隊維護的獨立組件在UI中集成顯示,這點將會非常的有用。下圖展現了此種類型的程序,每個高亮框里的UI都是一個單獨的組件。


組件集成UI

什么是Prism不能做的

盡管Prism解決了在WPF中可能遇到的很多問題,但是根據應用程序需求和場景的不同,也會有其他的問題出現。比如,Prism不能直接解決下面的問題。

  • 臨時連接和數據同步
  • 服務和消息的基礎設計
  • 身份認證和授權
  • 應用程序性能
  • 應用程序版本
  • 錯誤處理和容錯

先決條件

使用Prism必須會使用WPF。在使用Prism時,你將不可避免的接觸到下列概念:

  • XAML
  • Data binding
  • Resources
  • Commands
  • User Controls
  • Dependency properties
  • Behaviors

Prism概述

架構目標

為了幫助架構師和開發者實現下列目的:

  • 創建能夠由模塊組成的程序,這些模塊能夠被單獨地編寫、組裝、部署,并且對于程序來說是可選的
  • 最小化團隊之間的依賴,讓每個團隊專注與特定的領域。比如UI、邏輯代碼實現或者是架構代碼的開發。
  • 通過架構提高不同團隊之間的復用能力
  • 通過抽象團隊通用服務提高程序質量
  • 迭代添加新的功能

Prism設計目標

Prism被設計用來幫助你設計和實現豐富、靈活、易于維護的WPF程序。Prism實現了多種設計模式,突出架構設計的松耦合、關注點分離等原則。使用設計模式和Prism提供的額能力,你可以通過獨立開發的松耦合組件輕松的集成到整個應用程序中,從而開發一個應用程序。

Prism圍繞架構原則的分散關注點和松耦合原則而設計的。這使得Prism提供能一下的好處:

  • 重用。Prism通過允許組件和服務能夠輕松的被開發、測試、集成到一個或多個程序來實現重用。組件級別的復用是通過依賴注入來輕松地發現和集成單元測試級別的組件。應用級別的復用是重用封裝了應用級別能力的模塊。
  • 可擴展。Prism通過管理組件依賴,允許組件在運行時很容易地被集成或者被其他實現所替換,使得程序能夠很容易地被擴展。并且將程序分解到模塊,使得模塊能夠獨立地更新和部署。Prism庫中的許多組件本身就可以被擴展或者是替換。
  • 靈活。Prism通過允許像開發集成新能力一樣更新功能。Prism還允許WPF程序使用通用服務和組件開發,允許程序以最適當地方式去部署和使用。還允許程序基于不同的角色和配置,提供不同的使用功能。
  • 團隊開發。Prism促進團隊開發,通過允許不同的團隊單獨開發甚至部署不同的應用程序部分。通過讓團隊專注于不同的功能領域或業務功能領域來減少團隊之間的依賴。
  • 質量。Prism通用讓開發團隊充分地測試服務和組件提高程序質量。此外,由于通用服務和組件都被完全地測試過了,開發團隊能夠專注于程序需求而不是如何實現和測試基礎代碼。

Prism關鍵概念

Prism提供的能力和設計模式也許對你而言并不熟悉,特別是你剛接觸設計模式和復合應用程序開發。本章節提供了一個關于Prism的主要概念和代碼或文檔中你會看見的屬于的簡短介紹。

  • Modules。模塊是一些功能的集合,能夠被單獨地開發、測試和部署。在大多數情況下,模塊是被不同的團隊開發維護。一個典型的Prism程序是由多個模塊組成的。模塊用來表示特定業務相關的功能(例如配置文檔管理),并且封裝實現該功能需要的所有視圖,服務,和數據模型。模塊也可以用來封裝程序中可以重用的通用程序代碼或服務(例如登陸或異常管理服務)。
  • Module catalog。在復合程序中,模塊(modules)必須由宿主程序(host application)動態地發現和加載。Prism中,模塊目錄是用來指定哪些模塊需要被加載,加載時按照什么順序加載。模塊目錄是有模塊管理(module manager)組件和模塊加載(module loader)組件使用。為了初始化模塊,這兩個組件需要下載模塊(如果是遠程模塊的話),加載模塊到程序的域中。Prism中可以使用多種方式指定模塊目錄,直接在代碼中編寫、使用XAML聲明,或者是使用配置文件。如果有必要,你也可以實現一個自定義的模塊目錄。
  • Shell。Shell就是模塊的宿主程序。Shell定義了總的布局以及程序結構,但是通常不知道具體寄宿在其中的是什么模塊。它通常實現了公共程序服務和基本代碼,但是大多數功能和內容則是在模塊中實現的。Shell通常也提供了頂層的窗口或者虛擬元素用來承載模塊提供的不同UI組件。
  • Views。View是封裝了程序特定特性或功能的UI控件。View使用了MVVM模式來連接UI和后臺邏輯代碼及數據。View通常封裝了UI界面并且定義了用戶交互行為,使得View能夠脫離功能地更新和替換。視圖使用數據綁定來同Model層交互。
  • View models。View model是封裝了程序界面邏輯和狀態的類,屬于MVVM模式。View model封裝了大部分的程序功能。View model定義了屬性、命令、事件,View通過數據綁定來訪問這些屬性、命令和事件。
  • Models。Model層的類封裝程序的數據和業務邏輯,也是MVVM模式中的一部分。Model封裝了數據以及任何與數據有關的認證或邏輯規則,以保證數據的完整性和一致性。
  • Commands。命令封裝了程序的功能。使用命令能夠讓這些功能脫離UI界面地聲明和測試。命令能夠在View model層定義。Prism提供了DelegateCommand類和CompositeCommand類。CompositeCommand是用來表示一個能夠相互調用的命令的集合。
  • Region。Region是一個邏輯占位,在Shell或者是View中定義。Region使得程序UI布局被更新而不需要去更改程序邏輯。許多通用控件可以被當成Region使用,比如ContentControl、ItemsControl、ListBox或者是TabControl。View能夠在Region中自動顯示或者是編程控制View顯示。Prism能夠讓你通過Region實現導航。Region能夠被其他的組件通過RegionManager組件指定位置。RegionManager使用RegionAdapter和RegionBehavior組件來整合顯示在指定Region中的View。
  • Navigation。導航是一個改變程序UI來放映用戶和程序交互的結果或者是程序內部狀態變化的過程。Prism支持兩種導航:一種是基于狀態的導航,現有View的狀態被更新來實現簡單的導航;一種是View-Switching導航,新的View創建,來替換掉原來的View。View-Switching使用URI配合Region來實現靈活的導航。
  • EventAggregator。復合程序中的組件通常要與其他組件或者服務通過松耦合的方式通信。為了實現這個功能,Prism提供了EventAggregator組件。通過 發布-訂閱 機制,實現組件發布和訂閱事件,而不需要互相引用。EventAggregator通常用來支持定義在不同Module中的組件通信。
  • Dependency injection container。Prism使用依賴注入模式管理組件之間的依賴。依賴注入使得組件之間的依賴能夠動態的實現,并且是可擴展,可測試的。Prism支持的依賴注入有Unity和MEF,也可以使用其他的依賴注入容器通過ServiceLocator。
  • Services。Service封裝UI無關的功能,例如登錄、異常處理和數據獲取。Service能直接在程序中定義或者是在模塊中定義。Service通常由Dependency injection container注冊,這樣能夠被其他依賴于Service的組件請求創建。
  • Controllers。Controller是用來定義結構和初始化將要顯示在Region中的View的類。Controller封裝了哪些Views將被顯示的邏輯。Controller使用View-Switching的導航機制。
  • Bootstrapper。Bootstrapper組件是用來初始化Prism的組件和服務的。它用來初始化Dependency injection container來書冊任何應用程序級的組件和服務。同時他還配置和初始模塊目錄以及Shell的View和View Model。

Prism被設計成可以使用上述的功能或設計模式,你可以根據需要使用一種或多種。如果你想充分發揮Prism的優點,您通常會使用Prism的許多功能和設計模式相互結合。下面的插圖顯示了一個典型的Prism應用程序體系結構,展示了Prism的多種功能如何在復合應用程序一起工作。

典型Prism程序

大部分Prism程序有一個Shell程序和共享服務組成。Shell程序定義了Region來顯示頂層的View,共享服務能夠被加載的模塊訪問。Shell定義了一個合適的目錄來決定哪些模塊將在啟動時被加載更合適。同時一個依賴注入容器也被定義,來動態的實現組件依賴。Bootstrapper在程序啟動時注冊共享服務和組件。

單獨的模塊封裝了程序的部分功能,使用一個單獨的呈現模式例如MVVM。當模塊被加載時,模塊中定義的View會在Shell中定義的Region里顯示。在初始化完成之后,用戶被導航到各種不同的View去。

使用Prism

在前面的文章中,我們已經了解了Prism支持的主要功能和設計模式,現在我們來看看如何使用Prism開發一個新的程序。這一章節提供一個關于如何創建一個基礎的Prism程序的總覽。如果你有需要的話,你可以通過擴展這個基礎程序來使用其他Prism提供的能力或設計模式。

Prism不僅能輕松新建一個WPF復合程序,也可以將Prism用于已有程序中來使用Prism提供的功能和設計模式。

一個典型的Prism程序由一個Shell工程和多個Module工程組成。下圖展示了使用Prism開發符合程序會用到的活動。

創建復合程序的活動圖

一個典型的程序會使用到大部分甚至是全部的Prism提供的功能或設計模式,以此來享受到使用松耦合和分散關注點這些設計模式原則 帶來的好處。然而在本例中,我們創建的是一個基礎的Prism程序,所以只有一個Module,該Module只定義了一個View。

添加Prism Library的引用
大部分情況下,需要先添加引用到工程中。使用Visual Studio的NuGet能夠輕松的添加。

定義Shell

Shell提供給應用程序一個基本的布局。這個布局使用Region定義以便于后續由Module中的View顯示。View也能像Shell一樣,使用Region定義成可添加內容的區域,如下圖所示。Shell通常設置整個程序的外形,包含了程序使用的Style。

Shell, Views and Regions

創建Bootstrapper

Bootstrapper使用Prism Library Services和Unity Container或MEF Container同程序聯系起來。每一個程序都創建一個指定的Bootstrapper,通常是繼承至UnityBootStrapper或者是MefBootstrapper。下圖展示了這種關系。你需要決定使用哪一種來構建模塊目錄。每個程序至少需要提供一個模塊目錄和一個Shell。

默認情況下,Bootstrapper使用.NET Framwork Trace類記錄事件日志。大部分程序會使用自己的日志服務,比如Enterprise Library。程序可以在特定的Bootstrapper中使用特定的日志服務。

默認情況下,UnityBootstrapper和MefBootstrapper允許使用Prism Library Service。這些可以在你自定義的Bootstrapper中禁用或者被替換。

演示如何連接到Prism Library

創建Module

Module包含程序特定功能的View和服務。大多數情況下,這些是被包含在不同的程序集中,被不同的團隊開發。一個Module是由一個實現了IModule接口的類表示。此類Module,在初始化時注冊他們的View和Service而且可能添加一個或多個View到Shell。根據具體情況,你可能需要為你的模型類定義屬性或定義模型之間的依賴。

添加模塊View到Shell

Module通過Shell中的Region替換內容。在初始化時,Module通過RegionManager來定位Shell中的Region然后添加一個或多個View到這些Region或者是注冊一個或多個將被Region創建View類型。RegionManager負責追蹤程序中的Region,是從Bootstrapper實現的核心服務。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,001評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,786評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,986評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,204評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,964評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,354評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,410評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,554評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,106評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,918評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,093評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,648評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,342評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,755評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,009評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,839評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,107評論 2 375

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,681評論 25 708
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,803評論 18 139
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,155評論 4 61
  • 最近小伙伴之間老喜歡在半夜互相傷害。 美其名曰探討各地美食, 就是深夜食堂,放毒殺人。 晚上10點半,時機正好。 ...
    阿念_閱讀 281評論 2 1
  • 在學校里午睡,常常聽到忽遠忽近的飛機引擎轉動的聲音,和穿過云層的空曠聲。 聲音空靈而有穿透力,常常讓我感覺身處云端...
    Miss_soul閱讀 145評論 0 0