prism4.0——chapter 2:初始化Prism应用
Prism 4 Documentation:http://compositewpf.codeplex.com/releases/view/55580
這一章解決了建立和運行一個Prism應用需要做的事情。一個Prism程序需要在應用快速啟動的過程中進行注冊和配置,這就是眾所周知的bootstrapping 應用。
什么是一個Bootstrapper?
一個bootstrapper是一個類,它會用Prism類庫來承擔已建立的應用程序的初始化。通過運用bootstrapper,你將更好的控制怎樣將Prism類庫的組件連接到你的應用中。
Prism類庫包含了一個默認的抽象的Bootstrapper基類,這些基類可以通過任一容器對其具體化的方式來使用。在bootstrapper類上的需多方法是虛擬方法。你可以重寫這些方法,讓這些方法成為適合你自己習慣的bootstrapper安裝啟用。
bootstrapper過程的基礎近階
Prism類庫提供了一些附加的基類,這些基類從Bootstrapper中得到,有適合于大部分應用的默認安裝。唯一剩余的需要你的應用bootstrapper來實現的階段是創建和初始化shell。
Dependency Injection
通過Prism類庫建立起來的應用依賴于由容器提供的dependency injection。類庫提供的程序集于Unity或是MEF一起工作,它也允許你使用其他的dependency injection 容器。部分bootstrapper過程需要配置容器和為容器注冊類型。
?
Prism庫包含了UnityBootstrapper和MefBootstrapper類,這就能夠實現使用Unity或是MEF作為應用中dependency injection容器大部分需要的功能。除了前面例子中所展示的領域外,每一個bootstrapper在它們的容器中添加了一些具體的步驟。
創建shell
在傳統的WPF應用中,App.xaml文件中一個URI啟動是指定的,用來登陸主窗口。在Silverlight應用中,應用中的RootVisual屬性是在App.xaml文件后面的代碼中設定的。
在一個用Prism庫創建的應用中,創建shell或是主窗口是由bootstrapper來完成的。這是應為shell依賴于服務,像Region Manager,只有當它注冊以后shell才能顯示。
關鍵的決定
你決定了在你的應用中使用Prism庫之后,還需要做很多其他的決定:
- 你將需要決定你是否使用MEF,Unity或是為dependency injection 容器使用其他的容器。這將決定你使用哪個類來提供bootstrapper,你是否需要為其他的容器創建一個bootstrapper。
- 你需要思考在你的應用中要什么特定的應用服務。這些需要在容器中進行注冊。
- 決定固有的登陸服務是否適合你的需要或者你需要創建另一個登陸服務。
- 決定你的應用怎樣發掘模塊:是通過明確的代碼聲明,通過目錄瀏覽發現在模塊中的代碼屬性,部署或是XAML.
剩下的章節提供更多的細節。
核心腳本
創建一個快速啟動序列式你建立你的Prism應用重要的一部分。這一節敘述如何創建一個bootstrapper并定制它來創建一個shell,配置dependency injection 容器,注冊應用的水平服務和如何加載并初始化模塊。
為你的應用創建一個bootstrapper
如果你選擇使用Unity或是MEF作為你的dependency injection 容器,為你的應用創建一個簡單的bootstrapper是很容易的。你需要從MefBootstrapper或是UnityBootstrapper中創建一個新的類。然后,實施CreatShell這個方法。你也可以選擇為特定初始化shell重寫InitializeShell方法。
實施CreateShell方法
CreateShell方法允許開發人員為Prism應用指定最高層次的窗口。shell通常是主窗口或是主頁。通過返回你應用的shell類中的一個例子來實現這種方法。在一個Prism應用中,你可以創建一個shell對象或是將它從容器中解析出來,這取決于你應用的需要。
下面的代碼示例是使用ServiceLocator來決定shell對象的:
1 protected override DependencyObject CreateShell() 2 { 3 return ServiceLocator.Current.GetInstance<Shell>(); 4 }Note:
你總會看到ServiceLocator被用來解析類型的實例,以此取代了特定的依賴注入容器。ServiceLocator通過呼叫容器來實現,因此它為容器的未知代碼提供了一個好的選擇。你也可以直接應用和使用容器來取代ServiceLocator。
實現InitializeShell的方法
在你創建了一個shell以后,你可能需要運行初始化的步驟來確保shell在待顯示狀態。實現InitializeShell的方法取決于你是用WPF還是Silverlight寫的應用,這兩者是不同的。對于Silverlight應用來說,你需要設置shell作為應用的可視化根基,像如下所示:
?
c# protected override void InitializeShell() {Application.Current.RootVisual = Shell; }?
? 對于WPF應用,你將創建shell應用對象并將它設置為應用的主窗口,像如下所示(來自WPF模塊的快速入門)
?
1 c# 2 protected override void InitializeShell() 3 { 4 Application.Current.MainWindow = Shell; 5 Application.Current.MainWindow.Show(); 6 }?
InitializeShell方法的基礎實現不需要做什么。不調用基類實現是安全的。
創建和配置組件目錄
如果你建立一個組件應用,你將需要創建和配置一個組件目錄。Prism用一個具體的IModuleCatalog實例來闡釋了對于應用來說什么樣的組件式有效的,哪種組件可能需要下載下來試用,以及組件存放在哪里。
引導程序提供了一個受保護的ModuleCatalog屬性來引用目錄和一個可視化CreateModuleCatalog方法的基本實現。這個基本實現返回一個新的ModuleCatalog;然而,可以重寫這種方法以用來提供一個不同的IModuleCatalog實例取代它自身,就像下面的代碼顯示的那樣,這些代碼來自Silverlight快速入門中MEF模塊QuickStartBootstrapper。
1 c# 2 protected override IModuleCatalog CreatModuleCatalog() 3 { 4 //當使用MEF時,已存在的Prism模塊目錄是靜態的 5 //通過配置文件來配置模塊 6 return ModuleCatalog.CreatFormXaml(new Uri("/ModelarityWithMef.Silverlight;component/ModulesCatalog.xaml",UriKind.Relative)); 7 }?
在UnityBootstrapper和MefBootstrapper類中,Run方法調用CreateModuleCatalog方法然后用返回值的方式設這類的ModuleCatalog屬性。如果你要重寫這個方法,不需要調用基礎類的安裝啟動,因為你將會代替已經提供了的功能。更多關于模塊化的信息參照第四章,“模塊應用開發。”
創建和配置容器
在用Prism庫創建的應用中,容器起了一個關鍵的作用。Prism庫和創建在它頂部的應用都依賴于一個注入了需要的依賴和服務的容器。在容器配置階段,需要注冊幾個核心的服務。除了這些核心服務外,你可能需要具體應用服務,這些服務由于跟組成相關提供了附加的功能。
核心服務
下面的表格列出了在Prism庫中具體不適用的核心服務。
服務接口 | 描述 |
| IModuleManager | 為將要檢索的服務定義了接口并初始化了應用的模塊。 |
| IModuleCatalog | 包含了在應用中關于模塊的元數據。Prism庫提供了幾個不同的目錄。 |
| IModuleInitialize | 初始化模塊。 |
| IRegionManager | 為在布局中的可視化容器注冊和檢索區域。 |
| IEventAggregator | 在出版者和捐贈者之間的低耦合事件的收集。 |
| ILoggerFacade | 一個登陸機制的封裝,你可以選擇你自己的登陸機制。Stock? Trader RI通過EnterpriseLibraryLoggerAdapter類使用企業類庫登陸應用區域,這個可以作為一個例子來說明你怎樣使用你自己的記錄器。記錄服務已經用容器進行了注冊,它是通過bootstrapper的Run方法,使用CreateLogger方法的有效返回值來實現的。用這個容器來注冊其他的記錄器將不再生效;反而在bootstrapper上重寫了CreateLogger方法。 |
| IServiceLocator | 允許Prism庫使用容器。這可能對定制或是擴展類庫起作用。 |
具體應用服務
下面的表格列出了使用在Stock Trader RI中的具體應用服務。這個可以當做一個了解你的應用中可能提供的服務的類型的例子來使用。
Stock Trader RI中的服務 | 描述 |
| IMarketFeedService | 提供模擬的實時交易數據。PositionSummaryPresentationModel根據它從這個服務接收到的通告來跟心屏幕位置。 |
| IMarketHistoryService | 提供歷史交易數據用來展示所選基金的趨勢走向。 |
| IAccountPositionService | 技工文件夾中的基金列表 |
| IOrderService | 持續提交買/賣命令 |
| INewsFeedService | 為所選的基金提供一個新聞列表。 |
| IWatchListService | 當新的密切關注的項目被添加到觀看列表時進行操作。 |
在Prism中有兩個衍生Bootstrapper類可用,UnityBootstrapper和MefBootstrapper。創建和配置不同的容器涉及到實施起來不同但卻相同的概念。
在UnityBootstrapper中創建和配置容器
UnityBootstrapper類的CreateContainer方法很容易的可以創建和返回一個新的UnityContainer實例。在大部分情況中,你不需要改變這個功能;然而,方法是有效的,從而具有靈活性。
在創建了容器之后,它可能需要為你的應用進行配置。ConfigureContainer在UnityBootstrapper中的安裝被默認的注冊了許多核心Prism服務,如下所示。
Note:
這是一個當一個模塊在它的Initialize方法中注冊模塊級服務時的例子。
?
c# UnityBootstrapper.cs protected virtual void ConfigureContainer(){...if ( useDefaultConfiguration){RegisterTypeIfMissing( typeof( IServiceLocator),typeof ( UnityServiceLocatorAdapter), ture);RegisterTypeIfMissing( typeof( IModuleInitializer), typeof(ModuleInitializer), ture);RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true);RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true);RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true);RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true);RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true);
RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true);} }
? 引導程序的RegisterTypeIfMissing方法決定了一個服務是否被注冊,它將不會被二次注冊。你就可以通過配置來重寫默認的注冊。你也可以關閉默認注冊服務;如果你這樣做,用傳入false參數加載Bootstrapper.Run 方法。你也可以重寫ConfigureContainer方法禁用你不想使用的服務,像事件聚合器。
Note:
??? 如果你關閉了默認注冊,你需要手動注冊需要的服務。
?
要擴展默認的ConfigureContainer方法,只需要簡單的添加一個方法重寫到你應用的引導程序中,隨意調用基本的安裝啟用,如下面的代碼所示,這些代碼是Modularity for WPF(with Unity)QuickStart中的QuickStartBootstrapper。這個實現調用了基類的安裝啟用,注冊了ModuleTracker類型作為IModuleTracker的具體實施,并且注冊了callbackLogger作為一個Unity的CallbackLogger的單例模式。
?
1 C# 2 protected override void ConfigureContainer() 3 { 4 base.ConfigureContainer(); 5 this.RegisterTypeIfMissing(typeof(IModuleTracker),typeof(ModuleTracker),ture); 6 this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger); 7 }?
?
?
在MefBootstrapper中創建和配置容器
MefBootstrapper類的CreateContainer方法做了如下幾件事情。第一,它創建了一個AssemblyCatalog和一個CatalogExportProvider。CatalogExportProvider允許MefExtensions程序集為許多Prism類型提供默認的主配置文件,也允許你重寫默認類型的注冊。其次,CreateContainer使用CatalogExportProvider創建并返回了一個新的CompositionContainer實例。在大部分情況中,你不需要改變這個功能;然而,這個方法是虛擬的,因此允許靈活使用。
Note:在Silverlight中,由于受安全性限制,不能用一個類型來取回一個集合。Prism使用了Assembly.GetCallingAssembly方法來取代。 |
容器創建了之后,需要對你的應用進行配置。MefBootstrapper中的ConfigureContainer的實現默認的注冊了許多核心Prism服務,像如下的代碼所示。如果你重寫這個方法,要考慮清楚你是否應該調用基類的實現來注冊核心的Prism服務,你是否需要在你的應用實現中提供這些服務。
?
C# protected virtual void ConfigureContainer() {this.RegisterBootstrapperProvidedTypes(); } protected virtual void RegisterBootstrapperProviderTypes() {this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger);this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog);this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container));this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog); }?
| Note: 在MefBootstrapper中,Prism的核心服務作為單例添加到了容器中,因此它們可以在整個應用的過程中通過容器進行定位。 |
MefBootstrapper除了提供CreateContainer和ConfigureContainer方法外,通過使用MEF也提供兩個方法來創建和配置AggregateCatalog。CreateAggregateCatalog方法很容易的創建和返回一個AggregateCatalog對象。像MefBootstrapper中的其他方法一樣,CreateAggregateCatalog是虛擬的,如果需要的話可以重寫它。
ConfigureAggregateCatalog方法允許命令式的將類型注冊添加到AggregateCatalog中。例如,Modularity with MEF for Silverlight QuickStart中的QuickStartBootstrapper明確將ModuleA和ModuleC添加到了AggregateCatalog中,如下所示:
?
C# protected override void ConfigureAggregateCatalog() {base.ConfigureAggregateCatalog();//將這個集合添加到ModuleTracker出口中this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly));//...this.AggregateCatalog.Catalogs.Add(new.AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly));//...this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ModuleA.ModuleC).Assembly)); }?
?
?
?
更多信息
關于MEF的更多信息,AggregateCatalog和AssemblyCatalog,參見MSDN上的“Managed Extensibility Framework Overview”http://msdn.microsoft.com/en-us/library/dd460648.aspx .
?
?
?
?
?
轉載于:https://www.cnblogs.com/blancpure/archive/2012/07/03/2574378.html
總結
以上是生活随笔為你收集整理的prism4.0——chapter 2:初始化Prism应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Husband的忏悔书(IT攻城狮)
- 下一篇: 炎炎夏日需要一个清凉的地 - 自制水冷系