原文
この項目では、WPFアプリケーションの起動や実行するためのPrismを取得するために発生する、必要があることに対処します。Prismアプリケーションは、 アプリケーションの起動プロセスの間で、登録と設定を必要とします。-これは、アプリケーションのブートストラップとして知られています。 Prismのブートストラップ・プロセスは、モジュール・カタログを作成し、設定する、Unityのような、依存関係注入コンテナを作成すること、 UI構成のための既定の領域アダプタを設定すること、シェル・ビューを作成して、初期化すること、そして、モジュールを初期化することが含まれています。
ブートストラッパーとは、何でしょうか?
What Is a Bootstrapper?
ブートストラッパーは、Prismライブラリを使用して構築されるアプリケーションの初期化のための、信頼できるクラスです。 ブートストラッパーを使用して、あなたは、Prismライブラリ・コンポーネントが、 あなたのアプリケーションに、どのように、接続されているか、多くのコントロールを持っています。
Prism Libraryには、既定の抽象的なBootstrapper基底クラスが含まれています。それは、どんなコンテナの用途でも、専門化することができます。 ブートストラッパー・クラスのメソッドの多くは、仮想メソッドです。 あなたは、適切な、あなた独自のユーザー定義したブートストラッパーの実装で、これらのメソッドを上書きすることができます。
ブートストラップ・プロセスの基本的な段階
Basic stages of the bootstrapping process
Prismライブラリは、いくつかの追加された基底クラスを提供します。 ほとんどのアプリケーションために、適切な既定の実装を持つ、Bootstrapperから派生します。 実装するあなたのアプリケーション・ブートストラッパーのために、残されただた一つのステージは、シェルを作成し、初期化します。
依存関係注入
Dependency Injection
Prismライブラリで構築されるアプリケーションは、コンテナに提供される依存関係注入に依存しています。 ライブラリは、Unityアプリケーション・ブロック(Unity)やManaged Add-in Framework(MAF)で動作するアセンブリを提供します。 そして、それは、あなたが、他の依存関係注入コンテナを使用できます。 ブートストラップ・プロセスの一部は、コンテナで、このコンテナを設定し、形式を登録します。
Prismライブラリには、UnityやMEFのどちらでも使用するために、必要な機能のほとんどを実装する、 UnityBootstrapperとMefBootstrapperクラスが含まれています。あなたのアプリケーションの依存関係注入コンテナとして、先程のイラストに示されている段階に加えて、 それぞれのブートストラッパーは、そのコンテナに、特定のいくつかの手順を追加します。
シェルを作成する
Creating the Shell
従来のWindows Presentation Foundation (WPF)アプリケーションでは、スタートアップの統一リソース識別子 (URI)は、 メイン・ウィンドウを起動するApp.xamlファイルに明記されています。
Prismライブラリで作成されたアプリケーションでは、シェルやメイン・ウィンドウを作成することは、ブートストラッパーの責務です。 これは、シェルが、サービスに依存しているため、Region Managerのような、それは、シェルが、表示される前に登録することが必要です。
重要な決定
Key Decisions
あなたが、アプリケーションで、Prismライブラリを使用することに決めたあと、作成する必要がある、多くの追加の決定があります。:
- あなたは、あなたが、あなたの依存関係注入コンテナのために、MEF、Unityや他のコンテナを使用するかどうか、決める必要があります。 これは、あなたが使用する、提供されたブートストラッパー・クラス、 そして、あなたが、他のコンテナのために、ブートストラッパーを作成する必要があるかどうかに関係なく決定されるでしょう。
- あなたは、あなたのアプリケーションで、あなたが望むアプリケーション固有のサービスついて、 考える必要があります。これらは、コンテナに登録する必要があります。
- 組み込みの記録サービスが、あなたの用途のために十分かどうか、あるいは、 あなたが、他のログの記録サービスを作成する必要がある場合かを判断します。
- アプリケーションで、モジュールを、どのように見つけるかについて決定します。: 明示されたコード宣言を通して、モジュールのコード属性は、ディレクトリ走査、設定やXAMLによって発見します。
この項目の残りは、より多くの詳細を提供します。
中心となる筋書き
Core Scenarios
起動シーケンスの作成は、あなたのPrismアプリケーションを構築する重要な部分です。この項目は、シェルを作成するために、 ブートストラッパーをどのように作成し、それをカスタマイズし、依存関係注入コンテナを設定する、 アプリケーション・レベルのサービスを登録します。そして、モジュールを、どのように読み込んで、初期化するかを説明します。
あなたのApplicationのために、ブートストラッパーを作成します。
Creating a Bootstrapper for Your Application
あなたが、あなたの依存関係注入コンテナとして使用するために、UnityやMEFのどちらも選択する場合、 あなたのアプリケーションのための単純なブートストラッパーを作成することは簡単です。 あなたは、MefBootstrapperやUnityBootstrapperのどちらも継承する新しいクラスを作成する必要があるでしょう。 続いて、CreateShellメソッドを実装します。必要に応じて、 あなたは、シェルに固有の初期化のために、InitializeShellメソッドを上書きするかもしれません。
CreateShellメソッドを実装する
Implementing the CreateShell Method
CreateShellメソッドは、開発者が、Prismアプリケーションのための最上位のウィンドーを指定することができます。 シェルは、通常、MainWindowやMainPageです。あなたのアプリケーションのシェルクラスのインスタンスを返すことで、このメソッドを実装します。 Prismアプリケーションでは、あなたは、シェル・オブジェクトを作成することができます。 あるいは、あなたのアプリケーションの要件に依存して、コンテナからそれを解決します。
シェル・オブジェクトを解決するために、ServiceLocatorを使用する例は、次のコードの例で示されます。
protected override DependencyObject CreateShell()
{
return ServiceLocator.Current.GetInstance<Shell>();
}
備考
あなたは、多くの場合、特定の依存関係注入コンテナの代わりに、インスタンス型を解決するために、使用されているServiceLocatorを見るでしょう。 ServiceLocatorは、コンテナを呼び出すことで、実装されています。 それで、それは、コンテナに依存しないコードのための優れた選択になります。また、あなたは、直接参照することができ、 ServiceLocatorの代わりにコンテナを使用することができます。
InitializeShellメソッドを実装する
Implementing the InitializeShell Method
あなたが、シェルを作成したあと、あなたは、シェルが、準備ができていることを表示する、確実にするための、 初期化手順を実行する必要があるかもしれません。WPFアプリケーションのために、 あなたは、ここに、示されるように、シェル・アプリケーション・オブジェクトを作成し、アプリケーションのメイン・ウィンドウとして、 それを設定するでしょう。:(WPFのためのモジュール方式のクイックスタートから)。
protected override void InitializeShell()
{
Application.Current.MainWindow = Shell;
Application.Current.MainWindow.Show();
}
InitializeShellの基本的な実装は、何もしません。基底クラスの実装を呼び出さないほうが、安全です。
モジュール・カタログを作成して、設定する
Creating and Configuring the Module Catalog
あなたが、モジュール・アプリケーションを構築している場合、あなたは、モジュール・カタログを作成して、設定する必要があります。 Prismは、どんなモジュールが、アプリケーションに利用できるか追跡するために、具体的なIModuleCatalogインスタンスを使用します。 そのモジュールは、ダウンロードするために、そして、モジュールが存在する場所で必要になるかもしれません。
ブートストラッパーは、仮想CreateModuleCatalogメソッドのカタログだけでなく、基本的な実装を参照するために、 保護されたModuleCatalogプロパティを提供します。基本的な実装は、新しいModuleCatalogを返します。; しかしながら、このメソッドは、WPFのクイックスタートのためのMEFによるモジュラー性のQuickStartBootstrapperから、 次のコードで示すように、代わりに、異なるIModuleCatalogインスタンスを与えるために、上書きできます。
protected override IModuleCatalog CreateModuleCatalog()
{
// When using MEF, the existing Prism ModuleCatalog is still
// the place to configure modules via configuration files.
// MEFを使用するとき、まだ、既存のPrismのModuleCatalogは、
// 構成ファイルによってモジュールを設定するための場所です。
return new ConfigurationModuleCatalog()
}
UnityBootstrapperとMefBootstrapperクラスの両方で、Runメソッドは、CreateModuleCatalogメソッドを呼び出します。 そして、戻り値を使用して、クラスのModuleCatalogプロパティに設定します。 あなたが、このメソッドを上書きする場合、あなたが、提供する機能を置き換えられるため、それは、基底クラスの実装を呼び出す必要はありません。 モジュラー性の詳細については、「モジュール・アプリケーション開発」(原文リンク)を参照してください。
コンテナを作成して、設定する
Creating and Configuring the Container
Prismライブラリで作成されるアプリケーションでは、コンテナは重要な役割を果たします。 Prismライブラリとアプリケーションの両方では、必要な依存関係とサービスを注入するために、そのコンテナに依存して、一番上に構築されます。 コンテナ設定段階の間に、複数の中心的なサービスが、登録されます。 これらの中心的なサービスに加えて、あなたは、それに関係するものとして、追加された機能を与える、アプリケーション固有のサービスを持っているかもしれません。
中心的なサービス
Core Services
次の表は、Prismライブラリで、アプリケーションではない中心的な特定のサービスの一覧を示します。
サービス・インターフェース | 解説 |
IModuleCatalog | アプリケーション内のモジュールに関するメタデータが含まれています。 Prismライブラリは、複数の異なるカタログを提供します。 |
IModuleInitializer | モジュールを初期化します。 |
IRegionManager | レイアウトのための視覚的なコンテナの領域を登録し、読み出します。 |
IEventAggregator | イベントのコレクションは、パブリッシャとサブスクライバの間で疎く結合しています。 |
ILoggerFacade | ロギングメカニズムのためのラッパで、あなたは、あなた独自のロギングメカニズムを選択することができます。 EnterpriseLibraryLoggerAdapterクラスを通じて、どのように、あなたが、あなた独自のロガーを使用することができるかの例として、 株トレーダーの参考になる実装(株トレーダーRI)は、アプリケーション・ブロックにログインしているエンタープライズ・ライブラリを使用します。 ログの記録サービスは、ブートストラッパーのRunメソッドでコンテナに登録されます。 CreateLoggerメソッドによって返される値を使用して、コンテナは、動作しないかかもしれない他のロガーを登録します。 ;その代わりに、CreateLoggerメソッドをブートストラッパーで上書きします。 |
IServiceLocator | Prismライブラリは、コンテナにアクセスできます。あなたが、ライブラリをカスタマイズ、あるいは、拡張したい場合、これは、役に立つかもしれません。 |
アプリケーション固有のサービス
Application-Specific Services
次の表は、株トレーダーRIで使用されているアプリケーション固有のサービスの一覧を示します。 これは、あなたのアプリケーションが、提供するかもしれないサービスの種類を理解するための、一例として使用することができます。
株トレーダーRIのサービス | 解説 |
IMarketFeedService | リアルタイム(モックアップを作成した)市場データを与えます。PositionSummaryViewModelは、 このサービスからそれを受け取る、そのスクリーンの通知に基づいて、位置を更新します。 |
IMarketHistoryService | 選択されたファンドのために、過去の市場データを使用して、トレンド・ラインを表示することができます。 |
IAccountPositionService | ポートフォリオで、ファンドのリストを提供します。 |
IOrdersService | 送信された買物/売りの注文を永続化します。 |
INewsFeedService | 選択されたファンドのために、ニュース記事のリストを提供します。 |
IWatchListService | 新しい監視項目が監視リストに追加される時の処理をします。 |
Prismでは、UnityBootstrapperとMefBootstrapperの、2つのブートストラッパーから派生したクラスが利用できます。 異なるコンテナを作成し、設定することは、それぞれに実装される同じような概念が含まれています。
UnityBootstrapper内に、コンテナを作成して、設定する
Creating and Configuring the Container in the UnityBootstrapper
UnityBootstrapperクラスのCreateContainerメソッドは、UnityContainerの新しいインスタンスを簡単に作成し、返します。 ほとんどの場合、あなたは、この機能を変更する必要ありません。;しかしながら、メソッドは、仮想です。それによって、その柔軟性を提供します。
コンテナが作成されたあと、それは、おそらく、あなたのアプリケーションのために設定されている必要があります。ここに、示されるように 、UnityBootstrapper内のConfigureContainerの実装は、既定で、いくつかの中心的なPrismサービスを登録します。:
備考
その初期化されたメソッドで、モジュールが、モジュール・レベルのサービスに登録される時は、この1つの例です。
// UnityBootstrapper.cs
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);
RegisterTypeIfMissing(typeof(IRegionNavigationJournalEntry), typeof(RegionNavigationJournalEntry), false);
RegisterTypeIfMissing(typeof(IRegionNavigationJournal), typeof(RegionNavigationJournal), false);
RegisterTypeIfMissing(typeof(IRegionNavigationService), typeof(RegionNavigationService), false);
RegisterTypeIfMissing(typeof(IRegionNavigationContentLoader), typeof(UnityRegionNavigationContentLoader), true);
}
}
ブートストラッパーのRegisterTypeIfMissingメソッドは、サービスが、既に登録されているかを判断します。- それは、それを2回登録しません。これは、設定を通して、既定の登録をオーバーライドすることができます。 また、あなたは、既定で、どんなサービスでも登録を止めることができます。;これを実行するには 、重ねて読み込んだBootstrapper.Runメソッドを使用して、falseを渡します。 また、あなたは、あなたが、イベント・アグリゲーターのように、使用したいと思わない、 ConfigureContainerメソッドとdisableサービスをオーバーライドすることができます。
備考
あなたが、既定の登録を止める場合、あなたは、手動で必要とされるサービスを登録する必要があります。
ConfigureContainerの既定の動作を拡張するために、モジュール方式ののためのWPFの(Unityで)クイックスタートから、QuickStartBootstrapperから、 次のコードで示すように、簡単に、あなたのアプリケーションのブートストラッパーに、オーバーライドを追加し、基本的な実装を必要に応じて呼びます。 この実装は、基本的なクラスの実装を呼び出します。IModuleTrackerの具体的な実装として、ModuleTracker型を登録します。 そして、UnityによるCallbackLoggerの単体インスタンスとして、callbackLoggerを登録します。
protected override void ConfigureContainer()
{
base.ConfigureContainer();
this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker), true);
this.Container.RegisterInstance(this.callbackLogger);
}
MefBootstrapper内に、コンテナを作成して、設定する
Creating and Configuring the Container in the MefBootstrapper
MefBootstrapperクラスのCreateContainerメソッドは、いくつかのことを行います。 まず、それは、AssemblyCatalogとCatalogExportProviderを作成します。 CatalogExportProviderは、MefExtensionsアセンブリに、いくつかのPrismの型のために、既定のエクスポートを提供できます。 そして、さらに、あなたは、既定の型の登録をオーバーライドできます。続いて、CreateContainerは、作成します。 そして、CatalogExportProviderを使用して、CompositionContainerの新しいインスタンスを返します。 ほとんどの場合、あなたは、この機能を変更する必要ありません。; しかしながら、メソッドは仮想です。それによって、その柔軟性を提供します。
コンテナが作成されたあと、それは、あなたのアプリケーションのために設定されている必要があります。 MefBootstrapper内のConfigureContainerの実装は、既定で、 いくつかの中心的なPrismサービスを登録します。次のコードの例に示すように、あなたが、このメソッドを上書きする場合、 あなたが、中心的なPrismサービスを登録するために、基底クラスの実装を呼び出す必要があるかどうか、 あるいは、あなたが、あなたの実装で、これらのサービスを提供したい場合、慎重に考えます。
protected virtual void ConfigureContainer()
{
this.RegisterBootstrapperProvidedTypes();
}
protected virtual void RegisterBootstrapperProvidedTypes()
{
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);
}
備考
MefBootstrapperでは、Prismの中心的なサービスは、単体としてコンテナに追加されます。 それで、それらは、アプリケーションを通して、コンテナに配置することができました。
CreateContainerとConfigureContainerメソッドを提供することに加えて、また、MefBootstrapperは、 MEFで使用されるAggregateCatalogを作成し、設定するために、2つのメソッドを提供します。CreateAggregateCatalogメソッドは、 AggregateCatalogオブジェクトを簡単に作成し、返します。 MefBootstrapperの他のメソッドのような、CreateAggregateCatalogは、仮想です。 そして、必要に応じてオーバーライドされることができます。
ConfigureAggregateCatalogメソッドは、あなたが、いやおうなしに、AggregateCatalogに型登録を追加できます。 例えば、ここに、示されるように、MEFクイックスタートによるモジュラー性から、 QuickStartBootstrapperは、ModuleAとModuleCをAggregateCatalogに明示的に追加します。:
protected override void ConfigureAggregateCatalog()
{
base.ConfigureAggregateCatalog();
// Add this assembly to export ModuleTracker
// ModuleTrackerをエクスポートするために、このアセンブリを追加します
this.AggregateCatalog.Catalogs.Add(
new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly));
// Module A is referenced in in the project and directly in code.
// モジュールAは、コードの中で、プロジェクトとディレクトリで、参照されます。
this.AggregateCatalog.Catalogs.Add(
new AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly));
this.AggregateCatalog.Catalogs.Add(
new AssemblyCatalog(typeof(ModuleC.ModuleC).Assembly));
// Module B and Module D are copied to a directory as part of a post-build step.
// モジュールBとモジュールDは、ビルド後の手順の一部としてディレクトリへコピーされます。
// These modules are not referenced in the project and are discovered by inspecting a directory.
//これらのモジュールは、プロジェクトでは参照されず、ディレクトリを調べることによって発見されます。
// Both projects have a post-build step to copy themselves into that directory.
//どちらのプロジェクトも、そのディレクトリに、それら自身をコピーするために、ビルド後の手順を持っています。
DirectoryCatalog catalog = new DirectoryCatalog("DirectoryModules");
this.AggregateCatalog.Catalogs.Add(catalog);
}
詳細情報
More Information
MEF、AggregateCatalogとAssemblyCatalogの詳細については、MSDNのManaged Extensibility Frameworkの概要(原文リンク)を参照してください。