『Prism 5.0ソース走読』UnityBootstrapper

9817 ワード

UnityBootstrapper(abstract class)は、Prism.UnityExtensions.Desktopプロジェクトにあります.主にUnity Container(Dependency Injection Container)をサポートするためです.
UnityBoostrapperソースコードを開くと、主に次のような論理が表示されます.
1.Unity Containerプロパティの定義
public IUnityContainer Container { get; protected set; }

2.Run()の書き換え方法
 public override void Run(bool runWithDefaultConfiguration)

{

         ......  

}

これはBootstrapperのエントリメソッドであり,アプリケーション全体のエントリメソッドでもある.Run()メソッドでは主にアプリケーション初期化の論理が呼び出される.
  • Loggerインスタンスの作成(Bootstrapper実装、virtualメソッド)
    this.Logger = this.CreateLogger();

  • ModuleCatalogインスタンスの作成(Bootstrapper実装、virtualメソッド)
    this.ModuleCatalog = this.CreateModuleCatalog();

  • ModuleCatalogインスタンスの構成(Bootstrapper実装、virtualメソッド)
    this.ConfigureModuleCatalog();

  • DI Containerインスタンスを作成します(UnityBootstrapperインプリメンテーション、UnityContainerインスタンス、virtualメソッドを返します)
    this.Container = this.CreateContainer();

  • 構成DI Container(UnityBootstrapper実装、virtualメソッド)
    this.ConfigureContainer();

  • ServiceLocatorの構成(UnityBootstrapper Bootstrapper abstractメソッドの書き換え)
    protected override void ConfigureServiceLocator()
    
    {
    
          ServiceLocator.SetLocatorProvider(() => this.Container.Resolve<IServiceLocator>());
    
    }

  • Region AdapterのMappingを構成し、主に3種類のRegion Adapterのmapping:Selector、ItemsControl、ContentControl(Bootstrapper実装、virtualメソッド)がある.
    this.ConfigureRegionAdapterMappings();

  • デフォルトのRegion Behaviors(Bootstrapper実装、virtaulメソッド)を構成します.主な方法は、B i n d R i g i o n C o n t e x t O D e P e n d e ncyObjectBehavior、RegionActiveAwareBehavior、S y n c R i g i o n C o extWithHostBehaviorなどがありますが、具体的にはBoostrapperのConfigureDefaultRegionBehaviorsメソッドを参照してください.
    this.ConfigureDefaultRegionBehaviors();

  • Prism framework throwからのExceptionタイプを登録(Boostrapperメソッドを書き換える)
    protected override void RegisterFrameworkExceptionTypes()
    
    {
    
         base.RegisterFrameworkExceptionTypes();
    
    
    
         ExceptionExtensions.RegisterFrameworkExceptionType(
    
         typeof(Microsoft.Practices.Unity.ResolutionFailedException));
    
    }

  • アプリケーションShell(Boostrapper定義abstractメソッドを呼び出す)を作成します.Prismを使用する場合は、このメソッドを実装する必要があります.
    this.Shell = this.CreateShell();

  • Shellの作成に成功した場合、RegionManagerのSetRegionManagerとUpdateRegionsメソッドを呼び出してRegionの関連付けを処理します.親クラスの初期化シェルメソッド(virtual,具体的には実装されていない)は後で呼び出される.
    if (this.Shell != null)
    
    {
    
        this.Logger.Log(Resources.SettingTheRegionManager, Category.Debug, Priority.Low);
    
        RegionManager.SetRegionManager(this.Shell, this.Container.Resolve<IRegionManager>());
    
    
    
        this.Logger.Log(Resources.UpdatingRegions, Category.Debug, Priority.Low);
    
        RegionManager.UpdateRegions();
    
    
    
        this.Logger.Log(Resources.InitializingShell, Category.Debug, Priority.Low);
    
        this.InitializeShell();
    
    }

  • Modulesを初期化し、親メソッド
  • を書き換える
    if (this.Container.IsRegistered<IModuleManager>())
    
    {
    
        this.Logger.Log(Resources.InitializingModules, Category.Debug, Priority.Low);
    
        this.InitializeModules();
    
    }

    これでRun()メソッドの作業が完了する.
    3.DI Containerの構成
    UnityBootstrapperのもう一つの重要な方法はConfigureContainer()です.この方法の主な機能
  • Unity Containerにextensionを追加する:UnityBootstrapperExtension.
  • Prismフレームワークの主な例をUnity Containerに注入する.
  •         protected virtual void ConfigureContainer()
    
            {
    
                this.Logger.Log(Resources.AddingUnityBootstrapperExtensionToContainer, Category.Debug, Priority.Low);
    
                this.Container.AddNewExtension<UnityBootstrapperExtension>();
    
    
    
                Container.RegisterInstance<ILoggerFacade>(Logger);
    
    
    
                this.Container.RegisterInstance(this.ModuleCatalog);
    
    
    
                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);
    
                    RegisterTypeIfMissing(typeof(IRegionNavigationJournalEntry), typeof(RegionNavigationJournalEntry), false);
    
                    RegisterTypeIfMissing(typeof(IRegionNavigationJournal), typeof(RegionNavigationJournal), false);
    
                    RegisterTypeIfMissing(typeof(IRegionNavigationService), typeof(RegionNavigationService), false);
    
                    RegisterTypeIfMissing(typeof(IRegionNavigationContentLoader), typeof(UnityRegionNavigationContentLoader), true);
    
                }
    
            }