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

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

Prism Library 5.0 for WPFを使用したモジュール・アプリケーション開発 01[C# WPF Prism]

概要

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

原文

Modular Application Development Using Prism Library 5.0 for WPF」(外部サイト)の和訳です。

訳文

Modular Application Development Using Prism Library 5.0 for WPF(外部サイト)

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

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

モジュール・アプリケーションは、より大規模なアプリケーションに統合することができる、対となる疎く結合した機能単位に分割されているアプリケーションです (名前を付けたモジュール)。クライアント・モジュールは一部のアプリケーションの全体的な機能をカプセル化して、一般的に対となる関連した関係を示します。 それは、ユーザー・インターフェイスとビジネス・ロジックやアプリケーション基盤構造の一部が含まれているアプリケーション機能のような、 ログを記録するためのアプリケーション・レベルのサービスや認証しているユーザーのような、関連したコンポーネントのコレクションを含むことができます。モジュールは、 相互に独立していますが、疎く結合したやり方で、互いに情報交換することができます。 モジュール・アプリケーション設計を使用することで、あなたのアプリケーションを開発して、テストして、 配布して、保持することをあなたのためのより簡単に作成します。

例えば、個人的な銀行業務アプリケーションを考えてみます。 ユーザーは、いろいろな機能にアクセスすることができます。このようなアカウントの間で、お金を転送する、 請求を支払い、一つのユーザー・インターフェイス(UI)から個人性情報を更新するように、 しかしながら、背後で、これらの機能の各々は、別々のモジュールの中でカプセル化されます。 これらのモジュールは、互いに、そして、データベースサーバとWebサービスのような、バックエンドシステムと情報交換します。 アプリケーションサービスは、それぞれの異なるモジュールの中に、様々なコンポーネントを統合し、そして、ユーザーとの通信を処理します。 ユーザーは、一つのアプリケーションのように見える、統合ビューを見ています。

次の図は、複数のモジュールとモジュール・アプリケーションのデザインを示しています。

複数のモジュールとモジュール・アプリケーションのデザイン

モジュール構成

モジュール・アプリケーションを構築する利点

Benefits of Building Modular Applications

あなたは、おそらく、これまでに、アセンブリ、インターフェースとクラス、そして、優れたオブジェクト指向設計の原則を使用して、 上手に設計されたアプリケーションを構築しています。それにしても、細心の注意が取られない限り、 あなたのアプリケーション設計は、まだ「モノリシックである」場合があります。 (すべての機能は、アプリケーション内のどこかで密接に結びついた方法で実装されています)、 それは、アプリケーションを難しく開発、テスト、拡張、保守するために、作成することができます。

モジュール・アプリケーション・アプローチ、一方で、あなたのアプリケーションの大規模な機能領域を識別することで、 あなたを助けることができます。 そして、あなたが、独立してその機能を開発し、そして、テストすることができます。これは、より簡単に、開発とテストを作成することができます。 しかし、また、それは、あなたのアプリケーションを、将来、より柔軟に、そして、より簡単に拡張するために、作成することができます。 モジュール化による方法の利点は、それが、あなたの全体的なアプリケーション・アーキテクチャを、より柔軟で保守しやすく作成できることです。 なぜなら、それは、あなたのアプリケーションを、扱いやすい断片に破壊することができます。それぞれの断片は、特定の機能をカプセル化します。 そして、それぞれの断片は、明確な、しかし、疎く結合した通信回線で統合されます。

モジュール・アプリケーション開発のためのPrismのサポート

Prism's Support for Modular Application Development

Prismは、あなたのアプリケーションの、モジュール・アプリケーション開発のためのサポートと実行時の管理モジュールを提供します。 Prismのモジュール開発機能を使用することで、あなたの時間を節約することができます。 あなたが、あなた独自のモジュラー性フレームワークの実装とテストをする必要がないため、 Prismは、次のモジュール・アプリケーションの開発機能をサポートしています。:

  • 登録のためのモジュール・カタログは、モジュールとそれぞれのモジュールの場所に名をつけます。; あなたは、次に示す方法で、モジュール・カタログを作成することができます。:
    • コードやExtensible Application Markup Language (XAML)でモジュールを定義することで、
    • ディレクトリでモジュールを発見することによって、それで、あなたは、明示的に定義することなく、 統合されたカタログで、すべてのあなたのモジュールを読み込むことができます。
    • 設定ファイルでモジュールを定義することによって、
  • モジュールのための宣言型のメタデータの属性は、初期化モードと依存関係をサポートします。
  • 依存性注入コンテナとの統合により、モジュール間の疎結合をサポートします
  • モジュールを読み込むために:
    • 依存関係の管理、モジュールが正しい順序で読み込まれることを確実に行うために、 2重化とサイクル検出が含まれています。そして、一度だけ、読み込まれ、初期化されます。
    • アプリケーションの起動時間を最小限にするモジュールのオンデマンドとバックグラウンド・ダウンロード; 残りのモジュールは、バックグラウンドで、あるいは、それらが必要とされるとき、読み込まれ、初期化されることができます。

中心的な概念

Core Concepts

IModule:モジュール・アプリケーションの構成単位

IModule: The Building Block of Modular Applications

モジュールは、機能とリソースの論理的なコレクションです。これは、ある意味、パッケージ化されています。 それは、アプリケーションに、別々に、開発し、テストし、配布し、統合することができます。パッケージは、1つ以上のアセンブリであることができます。 それぞれのモジュールは、モジュールを初期化し、そして、アプリケーションに、その機能を統合するための役割を果たす中心となるクラスを持っています。 そのクラスは、IModuleインターフェイスを実装しています。

備考

IModuleインターフェイスを実装するクラスの存在は、モジュールとして、パッケージを識別するのに十分です。

IModuleインターフェイスには、Initializeという名前の、一つのメソッドがあります。 その中で、あなたは、アプリケーションに、モジュールの機能を初期化と統合することが必要な、どんなロジックでも実装できます。 モジュールの目的に応じて、それは、複数の要素で構成されたユーザー・インターフェイスに、ビューを登録することができます。 アプリケーションが利用できる追加のサービスを作成します。 あるいは、アプリケーションの機能を拡張します。次のコードは、モジュールの最低限の実装を示しています。


public class MyModule : IModule
{
    public void Initialize()
    {
        // Do something here.
        // ここで何かします。
    }
}

備考

IModuleインターフェイスで、提供される初期化の仕組みを使用する代わりに、 株トレーダーRIは、宣言、登録するビューための属性に基づくアプローチ、サービスと型を使用します。

モジュールの寿命

Module Lifetime

Prism内で、モジュールを読み込んでいるプロセスは、次のものが含まれています。:

  1. モジュールの登録/発見
  2. 特定のアプリケーションのための実行時に読み込まれるモジュールは、Moduleカタログで定義されています。 カタログには、読み込まれるモジュールに関するそれらの場所と順序に関する情報が含まれています。ここで、それらはロードされます。

  3. 読み込まれるモジュール
  4. モジュールが含まれるアセンブリは、メモリに読み込まれます。 この段階は、いくつかの遠隔地またはローカル・ディレクトリから取得することをモジュールに要求するかもしれません。

  5. モジュールを初期化すること
  6. モジュールは、続いて、初期化されます。モジュール・クラスの作成されるインスタンスを示しています。 そして、IModuleインタフェースを通じて、それらのInitializeメソッドを呼び出します。

次に示す図は、モジュールを読み込んでいるプロセスを示しています。

モジュールを読み込んでいるプロセス

モジュール読み込んでいるプロセス

モジュールのカタログ

Module Catalog

ModuleCatalogは、アプリケーションによって使用することができる、モジュールに関する情報を格納しています。 カタログは、本質的には、ModuleInfoクラスのコレクションです。それぞれのモジュールは、 モジュールの他の属性の間の名前、型と場所を記録する、ModuleInfoクラスで記述されています。 ModuleCatalogをModuleInfoインスタンスに書き込むには、いくつかの代表的な方法があります。:

  • コード内のモジュールを登録する
  • XAML内のモジュールを登録する
  • 設定ファイル内のモジュールを登録する
  • ディスク上のローカル・ディレクトリでモジュールを発見する

あなたが、使用する必要がある、登録と発見の仕組みは、あなたのアプリケーションが必要とするものに依存しています。 設定ファイルやXAMLファイルを使用することは、あなたのアプリケーションが、モジュールへの参照の必要をなくすことができます。 ディレクトリを使用することは、ファイルでそれらを指定することなく、アプリケーションが、モジュールを発見することができます。

いつモジュールを読み込むか制御する

Controlling When to Load a Module

Prismアプリケーションは、「利用可能な時」と知られているように、 あるいは、「オンデマンド」として知られているように、アプリケーションがそれらを必要とするとき、 可能な限り早くモジュールを初期化することができます。 モジュールをロードするために、以下のガイドラインを考えて見てください。:

  • アプリケーションが実行される時、アプリケーションを実行するために必要なモジュールは、 アプリケーションで読み込まれ、初期化されている必要があります。
  • 機能が含まれているモジュールは、それらが利用可能になるとき、たいてい、代表的な使い方で使用されるアプリケーションは、 バックグラウンドで読み込まれ、そして、初期化されていることができます。
  • めったに使用されない機能が含まれるモジュール(あるいは、他のモジュールが必要に応じて依存するモジュールをサポートします)。 オンデマンドで、読み込まれ、初期化されていることができます。

あなたが、あなたのモジュールを、ダウンロードし、初期化するために、どのように、設定するか判断するために、 あなたのアプリケーション、一般的に使用される筋書き、アプリケーション起動時間とダウンロードの数とサイズを、どのように、分割しているか考えてみてください。

統合されたモジュールとアプリケーション

Integrate Modules with the Application

Prismは、あなたのアプリケーションを起動する次のクラスを提供します。:UnityBootstrapperやMefBootstrapper。 これらのクラスは、モジュールを発見して、ロードするために、モジュール・マネージャを作成して、設定するために使用することができます。 あなたは、数行のコードで、XAMLファイル、設定ファイルやディレクトリの場所で、指定されるモジュールを登録するために、設定メソッドを上書きすることができます。

残りのアプリケーションでモジュールを統合するために、モジュールInitializeメソッドを使用します。 この変化する、あなた行う方法は、あなたのアプリケーションとモジュールの内容の構造に依存します。 以下は、あなたのアプリケーションに、あなたのモジュールを統合するために、一般的な行なう必要があることです。:

  • アプリケーションのナビゲーション構造に、モジュールのビューを追加します。ビュー発見やビュー注入を使用して、 複数の要素で構成されたUIのアプリケーションを構築するとき、これは、一般的です。
  • アプリケーションレベルのイベントやサービスに登録します。
  • アプリケーションの依存関係注入コンテナで共有サービスを登録します。

モジュール間の通信

Communicate Between Modules

モジュールは、相互に、弱い結合を持つ必要がありますが、モジュールが互いに、情報をやりとりすることは一般的です。 各々それら独自の強さで、いくつかの疎く結合した通信パターンがあります。 一般的に、これらのパターンの組合せは、結果として得られる解決法を作成するために使用されます。 以下は、これらのパターンのいくつかを紹介します。:

  • 疎く結合したイベント
  • モジュールは、確実にイベントが発生したことを、くまなく伝えることができます。他のモジュールは、イベントが発生するとき、 それらが通知されるように、それらのイベントに登録することができます。疎く結合したイベントは、2つモジュールの間で通信を設定する軽量な方法です。; その結果、それらは、簡単に実装されます。しかしながら、あまりに大量のイベントに頼るデザインは、保守するのが難しくなります。 特に、多くのイベントが、単一タスクを成し遂げるために、互いに組織化されている必要がある場合、 その場合、共有サービスを検討したほうが良いかもしれません。

  • 共有サービス
  • 共有サービスは、一般的なインターフェースによってアクセスすることができるクラスです。 一般的に、共有サービスは共用アセンブリに存在し、認証、ログの記録、や設定のような、システム全体のサービスを提供します。

  • 共用リソース
  • あなたが、モジュールが互いに、直接、情報のやりとりしたくない場合、また、あなたは、データベースや対となるWebサービスのように、 共用リソースを通じて、それらに、間接的に情報をやりとりしてもらうことができます。

依存関係注入とモジュール・アプリケーション

Dependency Injection and Modular Applications

Unityアプリケーション・ブロック(Unity)のようなコンテナ、そして、Managed Add-in Framework(MAF)は、 あなたが、簡単に、疎く結合したやり方で、コンポーネントを構成することを助けるパワフルなデザインパターンの反転制御(IoC)と依存関係注入を使用することができます。 それは、コンポーネントが、参照をハードコードすることに依存せずに、他のコンポーネントの参照を取得することができます。 それによって、望ましいコードの再利用と柔軟性の向上を促進します。依存関係注入は、疎く結合した、モジュール・アプリケーションを構築するとき、 極めて役に立ちます。Prismは、アプリケーション内のコンポーネントを構成するために使用される、依存関係注入コンテナを選ばないように設計されています。 コンテナは、ご自由にお選びください。そして、主にあなたのアプリケーションの要件と選択によってきまります。 しかしながら、Microsoftから、考慮するための2つの主要な依存関係の注入フレームワークが、あるでしょうか?UnityとMEF。

パターンと実践Unityアプリケーション・ブロックは、依存関係注入コンテナの完全な機能を提供します。 それは、プロパティに基づいて、そして、コンストラクタに基づいて、なたが、コンポーネントの間で透過的な注入動作と方針ができる注入と注入方針をサポートします。 ;また、それは、依存関係注入コンテナで一般的な、他の機能の格納をサポートします。

MEF(は、.NET Framework 4.5の一部です)は、依存関係注入をサポートすることによって、 拡張可能な.NETアプリケーションを構築するためのサポートを提供します。-コンポーネントの構成に基づいて、 他の機能を提供します。それは、モジュール・アプリケーション開発をサポートしています。 それは、アプリケーションが実行時に、コンポーネントを発見すること、そして、疎く結合した方法でアプリケーションにそれらのコンポーネントを統合することができます。 MEFは、素晴らしい拡張性と構成のフレームワークです。それには、アセンブリと型の発見、 型の依存関係ソリューション、依存関係注入といくつかの素晴らしいアセンブリ・ダウンロード機能が含まれています。 次に示すものと同様に、Prismは、MEF機能を利用することをサポートしています。:

  • XAMLとコード属性を通してのモジュール登録
  • 設定ファイルとディレクトリ走査を通してのモジュール登録
  • モジュールが、読み込まれるような、状態の追跡
  • MEFを使用する際のモジュールのための、ユーザー定義した宣言型のメタデータ

UnityとMEF依存関係注入コンテナの両方は、Prismで継ぎ目なく動作します。

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