12: Patterns in the Prism Library 5.0 for WPF(原文)
Microsoft Prism Library 5.0 for WPFの開発者のガイドから
あなたが、アプリケーションを構築するとき、あなたは、一般的に、パターンに直面するか、使用します。 Prism Libraryとリファレンス実装の例で、ガイダンスは、アダプタ、アプリケーション・コントロール、コマンド、複合と複合View、依存関係注入、 Event Aggregator、外見、コントロールの反転、オブザーバ、Model-View-ViewModel(MVVM)、レジストリ、リポジトリー、分離されたインターフェイス、 プラグインとサービス・ロケーター・パターンを例証します。それは、この付録で簡単に説明されます。次の図は、Prism Libraryを使用している、 代表的な複合アプリケーション・アーキテクチャと共通のパターンのいくつかを示しています。 Prismを使用しながら、より簡単なアプリケーションは、おそらく、これらのパターンの一部に直面するでと思いますが、必ずしも、全てではありません。
共通のパターンによる複合アプリケーション・アーキテクチャのサンプル
Sample composite application architecture with common patterns
この項目は、あなたは、Prismコードの各々のパターンの例を確かめることができる、アルファベット順とポインターのパターンの簡単な概要を提供します。
アダプタ
Adapter
名前が示すように、アダプタ・パターンは、他のクラスによって期待されるインターフェイスと一致させるために、1つのクラスのインターフェイスに合わせます。 Prismライブラリでは、Windows Presentation Foundation (WPF) のItemsControl、ContentControlとSelectorに領域に合わせるために、アダプタ・パターンは、使用されます。 適用されるアダプタ・パターンを表示するには、ItemsControlRegionAdapter.csファイルについては、Prism Libraryを参照してください。
アプリケーション・コントロール・パターン
Application Controller Pattern
アプリケーション・コントロール・パターンは、あなたが、コントロールクラスに、Viewの作成と表示の役割を分離できます。 この種のコントローラは、MVCアプリケーションでは、コントローラーと比較して、少し異なります。 アプリケーション・コントローラーの役割は、Viewのプレゼンテーションのコントロールをカプセル化することです。 それは、Viewのインスタンス化を処理することができます。;それは、ユーザー・インターフェイス(UI)内に、それらを、適切なコンテナに配置することで、行います。 View間で、共有する同じコンテナを切り換ます。そして、ときどき、ViewやView Modelの間で通信を調整します。 パターンの名前が、Application Controllerであるにもかかわらず、コントローラは、多くの場合、アプリケーションのサブセットにスコープされます。 Prismアプリケーションやコントローラのモジュール・コントローラのような、それは、関連するViewのセットに及びます。 その結果、あなたは、多くの場合、Prismアプリケーション内に、1つ以上のコントローラを持っています。 このパターンの実装例については、OrdersControllerクラスについては、株トレーダーのリファレンス実装(株トレーダーRI)を参照してください。
コマンド・パターン
Command Pattern
Commandパターンは、オブジェクトは、動作を表示するために使用される、デザインパターンです。コマンド・オブジェクトは、動作とそのパラメータをカプセル化します。 これは、コマンドの呼び出し元とコマンドのハンドラの切り離しを提供します。Prism.Mvvmライブラリは、CompositeCommandを提供します。
それは、実行と通知のためのローカル・メソッドに、実行する能力を結合する、ICommandを提供するために、ViewModelやコントローラを提供する、 複数のICommand項目とDelegateCommandの結合を提供します。 CompositeCommandの使用法と株トレーダーRIのDelegateCommandを表示するには、 StockTraderRICommands.csファイルとOrderDetailsViewModel.csを参照してください。
複合と複合のView
Composite and Composite View
複合アプリケーションの中心に、複合Viewに、それぞれのViewを結合する能力があります。頻繁に、構成ビューは、子ビューのためのレイアウトを定義します。 例えば、次の図に示すように、アプリケーションのシェルは、実行時に、ナビゲーション領域、そして、子ビューを格納するコンテンツ領域を定義するかもしれません。
構成の例
Composition example
株トレーダーRIでは、これは、シェルで、領域を使用して確かめることができます。シェルは、領域を定義します。 そのモジュールは、初期化工程の間に、Viewを配置し、そして、追加します。領域を定義する例については、Shell.xamlファイルを参照してください。
複合Viewは、動的に構成する必要はありません。この場合のように、Prismの領域を使用するとき、また、複合Viewは、まさに、Viewです。それは、いくつかの他の子ビューで構築されます。 それは、UIの定義を通して、静的に構成されます。この例では、Extensible Application Markup Language (XAML)で宣言されている、子のユーザー・コントロールです。
依存関係注入パターン
Dependency Injection Pattern
依存関係注入パターンは、必要な依存関係を取得する工程の反転される懸念のControlパターン(この付録で後述される)の反転の特殊なバージョンです。 依存関係注入は、株トレーダーRIとPrism Libraryを通して使用されます。コンテナを使用するとき 、構築の役割は、消費されるクラスの代わりに、コンテナに与えられています。オブジェクトの構築時には、依存関係注入コンテナは、 どんな外部依存関係でも解決します。このため、依存関係の具体的な実装は、システムの進化として、より素早く、変更することができます。 システムのテスト容易性と成長の、このより優れたサポートは、よりゆるい結合に依存しています。 株トレーダーRIは、コンポーネントの間で、依存関係を管理を支援する拡張管理フレームワーク(MEF)を使用します。 しかしながら、Prism Libraryそのものは、特定の依存関係注入コンテナに結びついていません。; あなたは、あなたが望む、どの依存関係注入コンテナでも、自由に選択できますが、あなたは、アダプタを与える必要があります。 それは、IServiceLocatorインターフェイスを実装しています。Prism Libraryは、MEFとUnityアプリケーション・ブロック(Unity)の両方のためのアダプタを提供しています。 株トレーダーRIで、注入によって、その依存関係を解決したコンポーネントの例を参照するには、NewsController.csファイル内のコンストラクタを参照してください。 Unityを使用する例については、UI構成のQuickStart内の、ModuleInitクラスを参照してください。
Event Aggregatorパターン
Event Aggregator Pattern
複数のオブジェクトから、単一のオブジェクトを通して、Event Aggregatorパターン・チャネル・イベントは、クライアントのための登録を簡素化します。 Prismライブラリでは、Event Aggregatorパターンのバリエーションは、イベントを配置する、そして、配布する、あるいは、購読するために、複数のオブジェクトを提供します。 EventAggregatorとそれが管理するイベントを参照するには、Prism.PubSubEventsライブラリ内の、EventAggregatorとPubSubEventを参照してください。 株トレーダーRIのEventAggregatorの使いかたを参照するには、WatchListViewModel.csファイルを参照してください。
Facadeパターン
Facade Pattern
Facadeパターンは、より複雑なインターフェイスを単純化します。あるいは、インターフェイスの設定します。 それらを、簡単に使用をするために、あるいは、アクセスを、それらのインターフェイスに分離するために、 Prism Libraryは、それらのサービスの変更から、ライブラリを分離するために役立つ、コンテナのための外見とログの記録サービスを提供します。 これは、ライブラリの利用者が、Prism Libraryで作業する、それ自身のサービスを提供できます。 コンテナやログの記録サービスと情報をやりとりするとき、IServiceLocatorとILoggerFacadeインターフェイスは 、Prism Libraryが期待するインターフェイスの外見を定義します。
コントロール・パターンの反転
Inversion of Control Pattern
頻繁に、Control(IoC)パターンの反転は、クラスやフレームワークで、拡張を有効にするために、使用されます。 例えば、クラスは、イベントが呼び出されるとき、動作を取得するために、イベント・リスナーを提供することによって、 イベンティング・モデルと一緒に、特定の場所で、反転したコントロールの実行を設計します。
IoCパターンの2つのフォ-ムは、依存関係の注入とTemplate Methodパターンを含む、Prism Libraryと株トレーダーRIを実演します。 依存関係注入は、初めに、説明しています。Template Methodパターンで、基底クラスは、仮想、あるいは、抽象的メソッドを呼び出す、レシピや工程を提供します。 このため、継承されたクラスは、必要とされるビヘイビアを有効にするために、適切なメソッドを上書きすることができます。P rismライブラリでは、これは、UnityServiceLocatorAdapterクラスで示されます。 Templateパターンを使用する、他の例を参照するには、StockTraderRIBootstrapper.csファイルについては、株トレーダーRIを参照してください。
Observerパターン
Observer Pattern
Observerパターンは、変更しているオブジェクトから、オブジェクトの状態変化内で、それらの利害関係を分離しようと試みます。 .NET Frameworkでは、これは、多くの場合、イベントを通じて見る事ができます。 Prismは、ユーザーとの相互作用のため、実際に、選択された相互作用から、要求を分離するために、さまざまなObserverパターンを実演します。 これは、InteractionRequestオブジェクトによって実行されます。 それは、多くの場合、Model-View-ViewModel(MVVM)パターン内の、ViewModelによって提供されます。
このInteractionRequestは、Viewで監視されるイベントをカプセル化するオブジェクトです。 Viewが、対話の要求を受け取るとき、それは、相互作用を、どのように、取り扱うか、選択することができます。 Viewは、ユーザーにフィードバックを与えるモーダルウィンドウを表示することを、決定するかもしれません。 あるいは、それは、ユーザーの作業の流れをさえぎることなく、控え目な通知を表示するかもしれません。 オブジェクトとして、この要求を、提供することは、Viewで、分離コードを必要とすることなく、 要求、そして、応答を指定するWPFのデータ-バインドに方法を提供します。
Model-View-ViewModelパター
Model-View-ViewModel Pattern
プレゼンテーション・モデルは、ビジュアル・プレゼンテーションから、プレゼンテーションを分離するための、ロジックを維持することに、焦点を当てまる、いくつかのUIパターンの1つです。 これは、保守性とテスト容易性を改良するのに役立つ、そのビジュアル・ロジックから、ビジュアル・プレゼンテーションの関係を分離するために、行われています。 関連したUIパターンは、Model-View-Controller (MVC)とModel-View-Presenter (MVP)が含まれています。 Prismの株トレーダーRIで実演される、Model-View-ViewModel(MVVM)アプローチは、プレゼンテーション・モデル・パターンの固有の実装バリアントです。
Prism Libraryそのものは、分離されたUIパターンの選択に関して、中立であることを目的としています。 あなたは、どのパターンでも成功することができます。機能を考慮しますが、データ結合、コマンドとビヘイビアのためのWPFでは、MVVMパターンは、推奨されたアプローチです。 そして、Prismガイダンスは、ドキュメンテーションを提供します。そして、あなたが、開始するサンプルは、MVVMを使用しています。 基本的なMVVM QuickStartの中のMVVMの例を参照するには、 QuestionnaireView.xaml、QuestionnaireView.xaml.cs、QuestionnaireViewModel.csファイルを参照してください。
レジストリ・パターン
Registry Pattern
Registryパターンは、よく知られているオブジェクトから、1つ以上のオブジェクトを配置するために、アプローチを指定します。 Prism Libraryは、領域にビュー型を関連付けるとき、Registryパターンを適用します。 IRegionViewRegistryインターフェイスとRegionViewRegistryクラスは、それらの領域が、読み込まれるとき 、作成されるビュー型に、領域の名前を関連付けるために、使用されるレジストリを定義します。 このレジストリは、UI構成のQuickStart内の、ModuleInit.csファイルで使用されています。
分離されたインターフェイスとプラグイン
Separated Interface and Plug-In
配置する、そして、モジュールを読み込む能力は、実行時に、より大きな機会が開かれます。 並列開発のための、配布する選択肢のモジュールを展開します。 そして、より疎く結合したアーキテクチャを促します。次のパターンは、この能力を有効にします。:
- 分離されたインターフェイス。このパターンは、実装から別々のパッケージでインタフェース定義を配置することで、結合を削減します。 Unityで、Prismを使用するとき、各々のモジュールは、IModuleインターフェイスを実装しています。 UIの構成クイックスタートで、モジュールを実装する例については、ModuleInit.csファイルを参照してください。
- プラグイン。このパターンは、使用する具体的な実装を変更するとき、あるいは、具体的な実装の変更のため、 実行時に、再コンパイルを必要とすることを避けるために、クラスの具体的な実装を決定できます。 Prismライブラリでは、これは、配置するために、互いに動作する、DirectoryModuleCatalog、 onfigurationModuleCatalogとModuleInitializerを通して取り扱われます。 そして、IModuleプラグインを初期化します。 プラグインをサポートする例については、Prism LibraryのファイルDirectoryModuleCatalog.cs、 ConfigurationModuleCatalog.cs、ModuleInitializer.csを参照してください。
備考
MEFは、設計されましたプラグイン・モデルをサポートします。 コンポーネントが、具体的な実装を宣言的に、エクスポートやインポートできます。
サービス・ロケーター・パターン
Service Locator Pattern
サービス・ロケーター・パターンは、依存関係注入パターンが解決する、同じ問題を解決します。 しかし、それは、異なる方法を使用します。それは、固有のサービスを配置するために、サービスを、誰が実装するか知る必要無く、 興味を持っている、クラスを提供します。頻繁に、これは、依存関係の注入に代わるものとして、使用します。 しかし、それは、時間です。クラスが、依存関係の注入の代わりに、サービスの配置を使用する必要があるとき、 それが、サービスの複数の実装オブジェクトを解決するために、必要なときのような、Prismライブラリでは、 これは、ModuleInitializerサービスが、それぞれのIModulesを解決するとき、確かめることができます。 UIの構成クイックスタートで、サービスを配置するために、UnityContainerを使用する例については、ModuleInit.csファイルを参照してください。
詳細情報
More Information
以下は、株トレーダーRIとPrism Libraryで、パターンを見つけるための、参照とリンクです。:
- Chapter 4の複合のパターン、デザイン・パターン内の「構造パターン」:再使用できるオブジェクト指向ソフトウェア(1)の要素。
- Chapter 4の外見パターン、デザイン・パターン内の「構造パターン」:再使用できるオブジェクト指向ソフトウェア(1)の要素。
- Chapter 5のTemplate Methodパターン、デザイン・パターン内の「行動のパターン」:再使用できるオブジェクト指向ソフトウェア(1)の要素。
- Chapter 5のObserverパターン、デザイン・パターン内の「行動のパターン」:再使用できるオブジェクト指向ソフトウェア(1)の要素。
- MSDNの上の、オブザーバ設計パターン(原文)を調べる。
- Martin Fowlerによる、エンタープライズ・アプリケーション・アーキテクチャのパターンのリポジトリー・パターン(原文)、あるいは、彼のwebサイトの省略バージョン。
- コントロールのコンテナの反転、そして、Martin Fowlerのwebサイトの依存関係注入(原文)パターン。
- Martin Fowlerのwebサイトのプラグイン・パターン(原文)。
- Martin FowlerのwebサイトのRegistryパターン(原文)。
- Martin Fowlerのwebサイトのプレゼンテーション・モデル・パターン(原文)。
- Martin FowlerのwebサイトのEvent Aggregatorパターン(原文)。
- Martin Fowlerのwebサイトの分離されたインターフェイス・パターン(原文)。
- Martin FowlerのwebサイトのMVCとMVPバリアント(原文)。
- デザイン・パターン:MSDNのGriffin Caprioによる依存関係注入(原文)。
- John Gossmanのブログ上の、Model-View-ViewModelパターン(原文)
Unityアプリケーション・ブロックの詳細については、MSDNのUnityアプリケーション・ブロック(原文)を参照してください。
(1)Gamma、Erich、Richard Helm、Ralph JohnsonとJohn Vlissides。設計パターン: 再使用できるオブジェクト指向ソフトウェアの要素。Addison Wesley Professional、1995。