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