這一篇主要用來介紹一下基於Prism Library中的核心服務以及如何配置Container,還有一個重要的部分是如何管理各個組件之間的依賴性,下面就這些內容來做一一的介紹。
1 Prism中的核心服務
IModuleManager:為能夠檢索和初始化應用程序的各個模塊的服務定義接口。
IModuleCatalog:包含一個應用程序各個模塊的元數據,這個Prism Libray幾種不同的Catalog。
IModuleInitializer:初始化應用程序的各個模塊。
IRegionManager:注冊和檢索regions(姑且理解成視圖區域),這些對於整個布局來說都是可視化的容器。
IEventAggregator:它是一個事件的發布者和訂閱者之間的松散耦合的一個事件的集合。
ILoggerFacade:它是一個記錄機制的一個包裝器,因此你可以選擇你自己的記錄機制,當容器使用Bootstrapper的Run方法的時候,這個記錄服務就會被注冊,並且使用container注冊另外一個記錄器(logger)是無效的。
IServiceLocator:允許你通過Prism Library來獲取容器,如果你想定制或者擴展當前Prism Libray,這將是非常有用的。
2 創建和配置UnityBootstrapper中的Container
這個UnityBootstrapper類中提供了一個CreateContainer的方法,這個方法創建並且返回一個UnityContainer的實例,在大多數情況下,你不太需要去改變這些,這個CreateContainer()方法是一個虛方法,因此它是相當靈活的。
當這個容器被創建以后,就需要來配置你的應用程序了,這個ConfigureContainer()默認的注冊了一系列的Prism services,我們來看看這個方法的默認實現。
protected virtual void ConfigureContainer() { ... if (useDefaultConfiguration) { RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true); RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true); 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); } }
這個Bootstrapper的RegisterTypeIfMissing方法來決定一個服務是否已經注冊過,並且不會連續去注冊,通過重載這個方法,你也可以關閉已經注冊的服務,並且注冊自己的服務,以下面的代碼為例,解釋如何來注冊自己的服務。
protected override void ConfigureContainer() { base.ConfigureContainer(); this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker),true); this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger); }
下面我們就通過代碼來分析ModuleTracker和IModuleTracker。
這個類和接口是我們自己定義的用於管理我們自己的類,首先來介紹IModuleTracker。
public interface IModuleTracker { void RecordModuleConstructed(string moduleName); void RecordModuleDownloading(string moduleName, long bytesReceived, long totalBytesToReceive); void RecordModuleInitialized(string moduleName); void RecordModuleLoaded(string moduleName); }
根據命名的含義,我們不難看出具體的每一個方法的含義,RecordModuleConstructed(string moduleName)用於記錄當前的Module是通過構造函數來構造的,RecordModuleDownloading(string moduleName, long bytesReceived, long totalBytesToReceive)記錄當前的Module是通過網絡來下載的,RecordModuleInitialized (string moduleName)表示用來記錄當前的Moudule已經經歷過初始化階段,另外RecordModuleLoaded(string moduleName)用來記錄當前的Module已經加載完畢。ModuleTracker是繼承自IModuleTracker的具體實現,這里代碼太多就不一一說明,僅僅是一個提綱挈領的方式來講述基本的概念和原理。