ホーム > コンピュータ > C# > WPF in C# > Prism

ベクトルドロー・レベルゼロ+

Prism Library 5.0 for WPFを使用して、アプリケーションを初期化する [C# WPF Prism]

概要

MVVMパターン調べていて、Prismというツールキットを見つけました。MVVMパターンを使用するためのもっとも人気のあるツールキットのようです。

原文

Initializing Applications Using the Prism Library 5.0 for WPF」(外部サイト)の和訳です。

訳文

Initializing Applications Using the Prism Library 5.0 for WPF(外部サイト)

パターンと実践 ディベロパー・センター

Microsoft Prism Library 5.0 for WPFの開発者のガイドから:

この項目では、WPFアプリケーションの起動や実行するためのPrismを取得するために発生する、必要があることに対処します。Prismアプリケーションは、 アプリケーションの起動プロセスの間で、登録と設定を必要とします。-これは、アプリケーションのブートストラップとして知られています。 Prismのブートストラップ・プロセスは、モジュール・カタログを作成し、設定する、Unityのような、依存関係注入コンテナを作成すること、 UI構成のための既定の領域アダプタを設定すること、シェル・ビューを作成して、初期化すること、そして、モジュールを初期化することが含まれています。

ブートストラッパーとは、何でしょうか?

What Is a Bootstrapper?

ブートストラッパーは、Prismライブラリを使用して構築されるアプリケーションの初期化のための、信頼できるクラスです。 ブートストラッパーを使用して、あなたは、Prismライブラリ・コンポーネントが、あなたのアプリケーションに、どのように、接続されているか、多くのコントロールを持っています。

Prismライブラリには、既定の抽象的なBootstrapper基底クラスが含まれています。それは、どんなコンテナの用途でも、専門化することができます。 ブートストラッパー・クラスのメソッドの多くは、仮想メソッドです。 あなたは、適切な、あなた独自のユーザー定義したブートストラッパーの実装で、これらのメソッドを上書きすることができます。

ブートストラッパーの実装

ブートストラップ・プロセスの基本的な段階

Basic stages of the bootstrapping process

Prismライブラリは、いくつかの追加された基底クラスを提供します。ブートストラッパーから派生します。それは、既定の実装を持っています。 それは、ほとんどのアプリケーションために、適切です。 実装するあなたのアプリケーション・ブートストラッパーのために、残されただた一つのステージは、シェルを作成し、初期化します。

依存関係注入

Dependency Injection

Prismライブラリで構築されるアプリケーションは、コンテナに提供される依存関係注入に依存しています。 ライブラリは、Unityアプリケーション・ブロック(Unity)やManaged Add-in Framework(MAF)で動作するアセンブリを提供します。 そして、それは、あなたが、他の依存関係注入コンテナを使用できます。 ブートストラップ・プロセスの一部は、コンテナで、このコンテナを設定し、形式を登録します。

Prismライブラリには、UnityBootstrapperとMefBootstrapperクラスが含まれています。 それは、UnityやMEFのどちらでも使用するために、必要な機能のほとんどを実装します。 あなたのアプリケーションの依存関係注入コンテナとして、先程のイラストに示されている段階に加えて、 それぞれのブートストラッパーは、そのコンテナに、特定のいくつかの手順を追加します。

シェルを作成する

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の概要(原文リンク)を参照してください。

Copyright (C) 2011-2016 kukekko All Rights Reserved.
kukekko@gmail.com
ご連絡の際はアドレスの@は半角にしてください。 また、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません 」。
inserted by FC2 system