『Prism 5.0ソース走読』UnityBootstrapper
9817 ワード
UnityBootstrapper(abstract class)は、Prism.UnityExtensions.Desktopプロジェクトにあります.主にUnity Container(Dependency Injection Container)をサポートするためです.
UnityBoostrapperソースコードを開くと、主に次のような論理が表示されます.
1.Unity Containerプロパティの定義
2.Run()の書き換え方法
これはBootstrapperのエントリメソッドであり,アプリケーション全体のエントリメソッドでもある.Run()メソッドでは主にアプリケーション初期化の論理が呼び出される. Loggerインスタンスの作成(Bootstrapper実装、virtualメソッド)
ModuleCatalogインスタンスの作成(Bootstrapper実装、virtualメソッド)
ModuleCatalogインスタンスの構成(Bootstrapper実装、virtualメソッド)
DI Containerインスタンスを作成します(UnityBootstrapperインプリメンテーション、UnityContainerインスタンス、virtualメソッドを返します)
構成DI Container(UnityBootstrapper実装、virtualメソッド)
ServiceLocatorの構成(UnityBootstrapper Bootstrapper abstractメソッドの書き換え)
Region AdapterのMappingを構成し、主に3種類のRegion Adapterのmapping:Selector、ItemsControl、ContentControl(Bootstrapper実装、virtualメソッド)がある.
デフォルトの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メソッドを参照してください.
Prism framework throwからのExceptionタイプを登録(Boostrapperメソッドを書き換える)
アプリケーションShell(Boostrapper定義abstractメソッドを呼び出す)を作成します.Prismを使用する場合は、このメソッドを実装する必要があります.
Shellの作成に成功した場合、RegionManagerのSetRegionManagerとUpdateRegionsメソッドを呼び出してRegionの関連付けを処理します.親クラスの初期化シェルメソッド(virtual,具体的には実装されていない)は後で呼び出される.
Modulesを初期化し、親メソッド を書き換える
これでRun()メソッドの作業が完了する.
3.DI Containerの構成
UnityBootstrapperのもう一つの重要な方法はConfigureContainer()です.この方法の主な機能 Unity Containerにextensionを追加する:UnityBootstrapperExtension. Prismフレームワークの主な例をUnity Containerに注入する.
UnityBoostrapperソースコードを開くと、主に次のような論理が表示されます.
1.Unity Containerプロパティの定義
public IUnityContainer Container { get; protected set; }
2.Run()の書き換え方法
public override void Run(bool runWithDefaultConfiguration)
{
......
}
これはBootstrapperのエントリメソッドであり,アプリケーション全体のエントリメソッドでもある.Run()メソッドでは主にアプリケーション初期化の論理が呼び出される.
this.Logger = this.CreateLogger();
this.ModuleCatalog = this.CreateModuleCatalog();
this.ConfigureModuleCatalog();
this.Container = this.CreateContainer();
this.ConfigureContainer();
protected override void ConfigureServiceLocator()
{
ServiceLocator.SetLocatorProvider(() => this.Container.Resolve<IServiceLocator>());
}
this.ConfigureRegionAdapterMappings();
this.ConfigureDefaultRegionBehaviors();
protected override void RegisterFrameworkExceptionTypes()
{
base.RegisterFrameworkExceptionTypes();
ExceptionExtensions.RegisterFrameworkExceptionType(
typeof(Microsoft.Practices.Unity.ResolutionFailedException));
}
this.Shell = this.CreateShell();
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();
}
if (this.Container.IsRegistered<IModuleManager>())
{
this.Logger.Log(Resources.InitializingModules, Category.Debug, Priority.Low);
this.InitializeModules();
}
これでRun()メソッドの作業が完了する.
3.DI Containerの構成
UnityBootstrapperのもう一つの重要な方法はConfigureContainer()です.この方法の主な機能
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);
}
}