天天看點

Prism架構中的核心服務

  這一篇主要用來介紹一下基于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的具體實作,這裡代碼太多就不一一說明,僅僅是一個提綱挈領的方式來講述基本的概念和原理。