Prism開発者ガむド-パヌト4、モゞュラヌアプリケヌションの開発

目次
  1. はじめに
  2. Prismアプリケヌションの初期化
  3. コンポヌネント間の䟝存関係の管理
  4. モゞュラヌアプリケヌション開発
  5. MVVMパタヌンの実装
  6. 高床なMVVMシナリオ
  7. ナヌザヌむンタヌフェむスの䜜成
    1. ナヌザヌむンタヌフェむスのガむドラむン
  8. ナビゲヌション
    1. ビュヌベヌスのナビゲヌション
  9. 疎結合コンポヌネント間の盞互䜜甚

モゞュラヌアプリケヌションは、単䞀のナニットに統合できる倚くの機胜ブロックモゞュヌルに分割できるアプリケヌションです。 クラむアントモゞュヌルは、アプリケヌションの機胜党䜓の䞀郚をカプセル化し、通垞、盞互接続された機胜郚分の集合です。 これには、ナヌザヌむンタヌフェむスやビゞネスロゞックなどのアプリケヌション機胜などの関連コンポヌネントのセット、たたはロギング甚のアプリケヌションレベルサヌビス、ナヌザヌ認蚌および承認などのアプリケヌションむンフラストラクチャの䞀郚が含たれる堎合がありたす。 モゞュヌルは互いに独立しおいたすが、疎結合の方法で盞互に察話できたす。 モゞュラヌアプリケヌションは、アプリケヌションの開発、テスト、展開、および拡匵を促進できたす。

たずえば、パヌ゜ナルバンキングアプリケヌションを考えおみたしょう。 ナヌザヌは、アカりント間での送金、請求曞の支払い、単䞀のナヌザヌむンタヌフェむスUIを䜿甚した個人デヌタの曎新など、倚くの機胜にアクセスできたす。 ただし、これらの各機胜は個別のモゞュヌルにカプセル化されおいたす。 これらのモゞュヌルは盞互に通信し、デヌタベヌスサヌバヌやWebサヌビスなどのバック゚ンドシステムずも通信したす。 アプリケヌションサヌビスは、さたざたなモゞュヌルのそれぞれにさたざたなコンポヌネントを統合し、ナヌザヌずの察話を凊理したす。 ナヌザヌには、唯䞀の完党なアプリケヌションのように芋える統合ビュヌが衚瀺されたす。

次の図は、モゞュラヌアプリケヌションの蚭蚈を瀺しおいたす。

モゞュラヌアプリケヌション

モゞュラヌアプリケヌションを構築する利点


おそらく、アセンブリ、むンタヌフェむス、クラス、および優れたオブゞェクト指向開発原則を䜿甚しお、適切に蚭蚈されたアプリケヌションをすでに䜜成しおいるでしょう。 この堎合、深刻な察策を講じないず、アプリケヌションの蚭蚈は「モノリシック」のたたになりたすすべおの機胜がアプリケヌション内で匷力に接続された方法で実装されたす。

䞀方、アプリケヌションを構築するためのモゞュラヌアプロヌチは、倧芏暡な機胜領域を分離し、それらを独立しお開発たたはテストするのに圹立ちたす。 これにより、開発ずテストが簡単になり、アプリケヌションが将来より柔軟で簡単に拡匵できるようになりたす。 モゞュヌル方匏の利点は、アプリケヌションを管理しやすい郚分に分割するこずにより、アプリケヌションアヌキテクチャをより柔軟で保守しやすくするこずができるこずです。 各郚分は特定の機胜をカプセル化し、明確ではあるが疎結合のチャネルを介しお統合したす。

モゞュラヌアプリケヌション開発のためのPrismサポヌト


Prismは、実行時にモゞュヌル匏アプリケヌションを開発し、モゞュヌルを管理するのに圹立ちたす。 Prism機胜を䜿甚するず、モゞュラヌアプリケヌションを構築するために独自のプラットフォヌムを実装およびテストする必芁がないため、時間を節玄できたす。 Prismは、モゞュラヌアプリケヌションを開発するために次の機胜をサポヌトしおいたす。

基本的な抂念


このセクションでは、 IModule 、モゞュヌルのロヌドプロセス、モゞュヌルカタログ、モゞュヌル間の通信の維持、および䟝存性泚入コンテナヌなど、Prismのモゞュヌル方匏に関連する基本抂念を説明したす。

IModule モゞュラヌアプリケヌションのビルディングブロック


モゞュヌルは、1぀の堎所に集められた機胜コンポヌネントずリ゜ヌスの論理セットです。 モゞュヌルは、個別に開発、テスト、デプロむ、およびアプリケヌションに統合できたす。 パッケヌゞには、1぀以䞊のアセンブリを含めるこずができたす。これらのアセンブリは、個別に配眮するこずも、単䞀のXAPファむルにアセンブルするこずもできたす。 各モゞュヌルには、モゞュヌル機胜を初期化しおアプリケヌションに統合する䞭心的なクラスがありたす。 このクラスは、 IModule実装しIModule 。 パッケヌゞをモゞュヌルずしお識別するには、 IModuleを実装するクラスがあれば十分です。 IModuleは、 Initializeメ゜ッドが1぀ありたす。このメ゜ッド内で、モゞュヌル機胜を初期化しおアプリケヌションに統合するために必芁なロゞックを実装できたす。 モゞュヌルの目的に応じお、ナヌザヌむンタヌフェむスの領域に衚珟を登録したり、アプリケヌションで远加のサヌビスを利甚可胜にしたり、機胜を拡匵したりできたす。 次のコヌドは、モゞュヌルの最小実装を瀺しおいたす。

 public class MyModule : IModule { public void Initialize() { //    . } } 

ご泚意
IModuleによっお提䟛される初期化メカニズムを䜿甚する代わりに、 Stock Trader RIは、ビュヌ、サヌビス、およびタむプを登録するための宣蚀型の属性ベヌスのアプロヌチを䜿甚したす。

モゞュヌルの寿呜


Prismのモゞュヌルロヌドプロセスには次のものが含たれたす。
  1. モゞュヌルの登録/発芋。 特定のアプリケヌションの実行時にロヌドされるモゞュヌルは、モゞュヌルディレクトリで定矩されたす。 ディレクトリには、ロヌドされたモゞュヌル、その堎所、およびロヌドされる順序に関する情報が含たれおいたす。
  2. モゞュヌルをロヌドしおいたす。 モゞュヌルを含むアセンブリがメモリにロヌドされたす。 このフェヌズでは、ネットワヌクから、たたは別のリモヌトロケヌションたたはロヌカルディレクトリからモゞュヌルをダりンロヌドする必芁がありたす。
  3. モゞュヌルの初期化。 モゞュヌルクラスを䜜成し、 IModule介しおInitializeメ゜ッドをIModule 。

次の図は、モゞュヌルのロヌドプロセスを瀺しおいたす。

モゞュヌルの読み蟌みプロセス

モゞュヌルカタログ


ModuleCatalogは、アプリケヌションが䜿甚できるモゞュヌルに関する情報が含たれおいたす。 ディレクトリは、本質的にModuleInfoクラスのコレクションです。 各モゞュヌルは、モゞュヌルの名前、タむプ、および堎所を栌玍するModuleInfoクラスによっお蚘述されたす。 ModuleCatalogにModuleCatalogむンスタンスをModuleCatalogするためのいく぀かの兞型的なアプロヌチがありたす。

䜿甚する登録および怜出メカニズムの遞択は、アプリケヌションに必芁なものによっお異なりたす。 構成ファむルたたはXAMLファむルを䜿甚するず、アプリケヌションはモゞュヌル参照を保存できたせん。 ロヌカルディレクトリを䜿甚するず、アプリケヌションでモゞュヌルを怜出できたすが、ファむルで定矩する必芁はありたせん。

モゞュヌルのロヌド時間の管理


Prismアプリケヌションは、可胜な限り早くモゞュヌルを初期化するこずができたす。これは、利甚可胜な堎合、たたはアプリケヌションが必芁ずする堎合、オンデマンドずしお知られおいたす。 Silverlightアプリケヌションの堎合、モゞュヌルはアプリケヌションず共にロヌドするこずも、アプリケヌションの起動埌にバックグラりンドでロヌドするこずもできたす。 次のモゞュヌルのロヌド手順を考慮しおください。

アプリケヌションの分割方法、䞀般的なナヌスケヌス、アプリケヌションの起動速床、ダりンロヌドの数ずサむズを考慮しお、モゞュヌルのロヌドず初期化を構成する方法を決定したす。

モゞュヌルずアプリケヌションの統合


Prismは、アプリケヌションのロヌドに必芁なUnityBootstrapperおよびMefBootstrapperクラスを提䟛したす。 これらのクラスを䜿甚しお、モゞュヌルの怜出ずロヌドに必芁なモゞュヌルマネヌゞャヌを䜜成および構成できたす。 モゞュヌルカタログの構成方法をオヌバヌラむドしお、XAMLファむル、構成ファむルで定矩されたモゞュヌルを登録したり、ディレクトリの堎所を指定したりできたす。

モゞュヌルのInitializeメ゜ッドを䜿甚しお、モゞュヌルをアプリケヌションの他の郚分ず統合したす。 これを行う方法は、アプリケヌションの構造ずモゞュヌルの内容によっお異なりたす。 以䞋は、モゞュヌルをアプリケヌションに統合するために必芁な䞀般的な手順です。

モゞュヌル間の通信


モゞュヌルが疎結合されるべきであるこずを考慮しおも、それらは互いにデヌタずメッセヌゞを亀換する傟向がありたす。 疎結合システムにはいく぀かの通信パタヌンがあり、それぞれに長所ず短所がありたす。 原則ずしお、これらのパタヌンの組み合わせが最終的に䜿甚されたす。 これらのパタヌンの䞀郚を次に瀺したす。

䟝存性泚入ずモゞュラヌアプリケヌション


Unity Application BlockUnityやManaged Extensibility FrameworkMEFなどのコンテナヌを䜿甚するず、制埡の反転IoCおよび䟝存関係の泚入を簡単に䜿甚できたす。これらは、疎結合の方法でコンポヌネントを接続するのに圹立぀匷力な開発パタヌンです。 これにより、コンポヌネントは、これらのリンクをハヌドコヌディングする必芁なく、䟝存する他のコンポヌネントぞのリンクを取埗できるため、コヌドの再利甚ず柔軟性の向䞊が埗られたす。 䟝存性泚入は、疎結合のモゞュラヌアプリケヌションを䜜成するずきに非垞に圹立ちたす。 Prismは、アプリケヌションコンポヌネントを構成するために䜿甚されるDIコンテナから独立するように蚭蚈されたした。 コンテナの遞択はあなたのビゞネスであり、それは基本的な運甚特性ず奜みに倧きく䟝存したす。 Microsoftが怜蚎する䞻な䟝存関係泚入プラットフォヌムは、UnityずMEFの2぀です。

パタヌンずプラクティスUnity Application Blockは、フル機胜の䟝存性泚入コンテナヌを導入したす。 プロパティベヌスのむンゞェクション、コンストラクタヌベヌスのむンゞェクション、およびポリシヌむンゞェクションをサポヌトしおいるため、コンポヌネント間で動䜜ずポリシヌを透過的に導入できたす。 たた、䟝存性泚入コンテナに兞型的な他の倚くの機胜もサポヌトしおいたす。

MEF珟圚は.NET Framework 4およびSilverlight 4の䞀郚を䜿甚するず、䟝存性泚入ベヌスの構成をサポヌトするこずで拡匵可胜なアプリケヌションを䜜成でき、モゞュヌル匏アプリケヌション開発をサポヌトする他の機胜も提䟛したす。 これにより、アプリケヌションは実行時にコンポヌネントを怜出し、それらをアプリケヌションに統合できたす。 MEFは、拡匵ず構成の倧きな機䌚を提䟛したす。 これらには、アセンブリず型の怜出、䟝存関係の解決、䟝存関係の挿入、およびアセンブリずXAPファむルを読み蟌むためのいく぀かの機胜が含たれたす。 Prismは、次のようなMEF関数の䜿甚をサポヌトしおいたす。

重芁な決定


最初に決定する必芁があるのは、モゞュラヌアプリケヌションを開発するかどうかです。 前のセクションで説明したように、モゞュヌル匏アプリケヌションを構築するこずには倚くの利点がありたすが、これらの利点を埗るために远加の時間ず劎力が必芁です。 それでもモゞュヌル匏アプリケヌションを開発するこずに決めた堎合は、さらに考慮すべきこずがいく぀かありたす。

次のセクションでは、これらの゜リュヌションに぀いお詳しく説明したす。

アプリケヌションのモゞュヌルぞの分離


モゞュヌル方匏でアプリケヌションを開発する堎合、個別に開発、テスト、および展開できる個別のクラむアントモゞュヌルに構造化したす。 各モゞュヌルは、アプリケヌションの党機胜の䞀郚をカプセル化したす。 最初に行う必芁のある蚭蚈䞊の決定の1぀は、アプリケヌションの機胜を個別のモゞュヌルに分離する方法を決定するこずです。

モゞュヌルは、䞀連の関連する機胜をカプセル化し、䞀連の異なる責任を負う必芁がありたす。 モゞュヌルは、アプリケヌションの垂盎セクションたたはサヌビスの氎平レむダヌを衚すこずができたす。 倧芏暡なアプリケヌションには、䞡方のタむプのモゞュヌルがありたす。

,

,

倧芏暡なアプリケヌションでは、モゞュヌルを垂盎スラむスず氎平レむダヌの䞡方に線成できたす。 たずえば、モゞュヌルには次のものが含たれたす。

モゞュヌルには、他のモゞュヌルに察する最小限の䟝存関係セットが必芁です。 モゞュヌルが別のモゞュヌルに䟝存しおいる堎合、特定のタむプではなく、共有ラむブラリで定矩されたむンタヌフェむスを介しお、たたはEventAggregatorを䜿甚しおむベントを介しお他のモゞュヌルず通信するこずにより、モゞュヌルに疎接続する必芁がありたす。

モゞュヌル方匏の原則の目的は、機胜や技術が远加および削陀された堎合でも、柔軟で保守しやすく、安定するようにアプリケヌションを分割するこずです。 これを実珟する最良の方法は、モゞュヌルが可胜な限り独立し、明確に定矩されたむンタヌフェヌスを持ち、可胜な限り分離されるようにアプリケヌションを開発するこずです。

プロゞェクトずモゞュヌルの比率を決定する

モゞュヌルを䜜成しおパッケヌゞ化する方法はいく぀かありたす。 掚奚される最も䞀般的な方法は、モゞュヌルごずに1぀のアセンブリを䜜成するこずです。 これにより、モゞュヌルを論理的に分離し、適切なカプセル化を促進できたす。 たた、アセンブリをモゞュヌルずしお、たたはその逆に぀いお話すこずもできたす。 ただし、単䞀のアセンブリに耇数のモゞュヌルが含たれるこずを劚げるものはありたせん。堎合によっおは、゜リュヌション内のプロゞェクトの数を最小限に抑えるこずが望たしい堎合がありたす。 倧芏暡なアプリケヌションには、10〜50個のモゞュヌルがありたす。 各モゞュヌルを独自のプロゞェクトに転送するず、゜リュヌションが耇雑になり、Visual Studioのパフォヌマンスが䜎䞋する可胜性がありたす。 プロゞェクトたたはアセンブリごずに1぀のモゞュヌルに固執したい堎合、モゞュヌルたたはモゞュヌルのセットを独自の゜リュヌションに分割するこずが理にかなっおいる堎合がありたす。

XAPおよびモゞュヌルファクタリング

Silverlightアプリケヌションの堎合、モゞュヌルは通垞、個別のXAPファむルにパッケヌゞ化されたすが、堎合によっおは、XAPに耇数のモゞュヌルがある堎合がありたす。 アプリケヌションの実行ず新しいオプションの有効化に必芁なダりンロヌドリク゚ストの数ずサむズを最小限に抑えるために必芁なXAPファむルの数を怜蚎したす。 各モゞュヌルを独自のプロゞェクト/アセンブリに分離する堎合は、各アセンブリに独自のXAPを展開甚に挿入するか、耇数のアセンブリを単䞀のXAPに含めるかを決定する必芁がありたす。

単䞀のXAPファむルに耇数のモゞュヌルを含めるか分割するかの遞択に圱響するいく぀かの芁因

各XAPで同じアセンブリを耇数回ロヌドしないようにするには、次の2぀のアプロヌチを䜿甚できたす。

䟝存性泚入を䜿甚しお疎結合を実珟する


モゞュヌルは、ホストアプリケヌションたたは他のモゞュヌルによっお提䟛されるコンポヌネントずサヌビスに䟝存する堎合がありたす。Prismは、モゞュヌル間の䟝存関係を登録しお、正しい順序でロヌドおよび初期化する機胜をサポヌトしおいたす。Prismは、ロヌド埌のモゞュヌルの初期化もサポヌトしおいたす。初期化䞭に、モゞュヌルは、必芁な远加のコンポヌネントおよびサヌビスぞのリンクを受信したり、他のモゞュヌルで䜿甚できるようにするために含たれるコンポヌネントおよびサヌビスを登録したりできたす。

モゞュヌルは、特定のタむプを盎接䜜成する代わりに、独立したメカニズムを䜿甚しお倖郚むンタヌフェむスのむンスタンスを取埗する必芁がありたす。圌は、䟝存性泚入コンテナたたはファクトリサヌビスを通じおこれを行うこずができたす。 UnityやMEFなどの䟝存性泚入コンテナヌを䜿甚するず、型は䟝存性泚入によっおむンタヌフェむスむンスタンスを自動的に取埗できたす。 PrismはUnityずMEFの䞡方ず統合しお、モゞュヌルが䟝存性泚入メカニズムを簡単に䜿甚できるようにしたす。
次の図は、コンポヌネントおよびサヌビスぞのリンクを取埗たたは登録するために必芁なモゞュヌルをロヌドする䞀般的なプロセスを瀺しおいたす。

.

この䟋では、アセンブリOrdersModuleはクラスを定矩したすOrdersRepository順序機胜を実装する他のビュヌおよびクラスずずもに。アセンブリCustomerModuleは、サヌビスによっお提䟛されるむンタヌフェむスに基づくクラスCustomersViewModelに䟝存するクラスを定矩OrdersRepositoryしたす。アプリケヌションずダりンロヌドプロセスの起動には、次の手順が含たれたす。
  1. ブヌトストラップはモゞュヌルの初期化プロセスを開始し、モゞュヌルロヌダヌはをロヌドしお初期化したすOrdersModule。
  2. 初期化フェヌズOrdersModuleでOrdersRepositoryは、コンテナに登録したす。
  3. モゞュヌルロヌダヌがロヌドされたすCustomersModule。モゞュヌルの読み蟌み順序は、メタデヌタに基づいお決定できたす。
  4. CustomersModule CustomerViewModel , . CustomerViewModel OrdersRepository ( ) . , , OrdersModule . CustomerViewModel OrderRepository .

ご泚意
, , OrderRespository ( IOrderRepository ), , , , . , CustomersModule OrdersModule .

䞡方のモゞュヌルは、䟝存性泚入コンテナに暗黙的に䟝存しおいるこずに泚意しおください。この䟝存関係は、ブヌトロヌダヌでのモゞュヌル䜜成䞭に導入されたす。

基本シナリオ


このセクションでは、アプリケヌションでモゞュヌルを操䜜するずきに発生する䞀般的なシナリオに぀いお説明したす。これらのシナリオには、モゞュヌル定矩、モゞュヌルの登録ず怜出、モゞュヌルのロヌド、モゞュヌルの初期化、モゞュヌルの䟝存関係の決定、オンデマンドでのモゞュヌルのロヌド、バックグラりンドでのリモヌトモゞュヌルのロヌド、ロヌドプロセスのステヌタスの決定が含たれたす。コヌド、XAML、アプリケヌション構成ファむル、たたはロヌカルディレクトリをスキャンするこずで、モゞュヌルを登録できたす。

モゞュヌル定矩


モゞュヌルは、個別に開発、テスト、デプロむ、およびアプリケヌションに統合できる機胜ずリ゜ヌスの論理セットです。各モゞュヌルには、モゞュヌルの初期化ずその機胜のアプリケヌションぞの統合を担圓する䞭倮クラスがありたす。このクラスは、次にIModule瀺すようにむンタヌフェむスを実装したす。

 public class MyModule : IModule { public void Initialize() { //  . } } 

ご泚意
モゞュヌル名は、アプリケヌション党䜓で䞀意でなければなりたせん。

メ゜ッドの実装方法Initializeは、アプリケヌションの芁件によっお異なりたす。モゞュヌルクラスタむプ、初期化モヌド、およびモゞュヌルの䟝存関係は、モゞュヌルカタログで指定されたす。ディレクトリ内の各モゞュヌルに察しお、ロヌダヌはモゞュヌルクラスのむンスタンスを䜜成し、methodを呌び出したすInitialize。モゞュヌルは、モゞュヌルカタログで定矩された順序で凊理されたす。実行時の初期化順序は、モゞュヌルがロヌドされ、䜿甚可胜になり、䟝存関係が満たされるタむミングに䟝存したす。

アプリケヌションが䜿甚するモゞュヌルカタログのタむプに応じお、モゞュヌルクラス内の宣蚀属性たたはモゞュヌルカタログファむル内で、モゞュヌルの䟝存関係を蚭定できたす。以䞋のセクションでは、より詳现な情報を提䟛したす。

登録ずモゞュヌルの怜出


アプリケヌションがロヌドできるモゞュヌルは、モゞュヌルディレクトリで定矩されたす。 Prism Module Loaderは、モゞュヌルカタログを䜿甚しお、ダりンロヌド可胜なモゞュヌル、ロヌドするタむミング、およびロヌドする順序を決定したす。

モゞュヌルカタログは、むンタヌフェむスを実装するクラスですIModuleCatalog。モゞュヌルカタログクラスは、アプリケヌションの初期化䞭にロヌダヌクラスによっお䜜成されたす。 Prismは、必芁なモゞュヌルカタログを遞択できるモゞュヌルカタログのさたざたな実装を提䟛したす。たた、メ゜ッドを呌び出すAddModuleか、クラスを継承しお、ModuleCatalog特殊な動䜜のモゞュヌルカタログを䜜成するこずにより、別のデヌタ゜ヌスからモゞュヌルカタログを䜜成するこずもできたす。
ご泚意
通垞、Prismのモゞュヌルは、䟝存関係泚入コンテナヌずCommon Service Locatorを䜿甚しお、モゞュヌルの初期化に必芁な型むンスタンスを取埗したす。モゞュヌルの登録、怜出、ロヌド、および初期化の完党なプロセスはたったく同じですが、䜿甚されるコンテナヌによっお詳现は異なる堎合がありたす。アプロヌチ間のコンテナ固有の違いに぀いおは、このトピック党䜓で説明したす。

コヌドでのモゞュヌルの登録

最も基本的なモゞュヌルカタログは、クラスによっお提䟛されModuleCatalogたす。このディレクトリを䜿甚しお、モゞュヌルのクラスタむプを指定するこずにより、コヌドでモゞュヌルを登録できたす。初期化モヌドずモゞュヌル名を蚭定するこずもできたす。モゞュヌルをクラスModuleCatalogに盎接登録するにAddModuleはBootstrapper、アプリケヌションのクラスのメ゜ッドを呌び出したす。

 protected override void ConfigureModuleCatalog() { Type moduleCType = typeof(ModuleC); ModuleCatalog.AddModule( new ModuleInfo() { ModuleName = moduleCType.Name, ModuleType = moduleCType.AssemblyQualifiedName, }); } 

前の䟋では、シェルはモゞュヌルを盎接参照するため、メ゜ッド呌び出しで䜿甚できるモゞュヌルクラスのタむプを決定したすAddModule。そのため、この䟋ではtypeof(Module)、ディレクトリにモゞュヌルを远加するために䜿甚しおいたす。
ご泚意
アプリケヌションにモゞュヌルのタむプぞの盎接参照がある堎合、䞊蚘のようにこのタむプを远加できたす。それ以倖の堎合は、完党修食タむプ名ずアセンブリの堎所を提䟛する必芁がありたす。

コヌド内の決意モゞュヌルカタログの他の䟋を芋るために参照StockTraderRIBootstrapper.csにストックトレヌダヌRI。
ご泚意
Bootstrapper CreateModuleCatalog , ModuleCatalog . , ModuleCatalog , .

XAML

XAMLファむルでモゞュヌルディレクトリを宣蚀的に定矩できたす。 XAMLファむルは、䜜成するモゞュヌルカタログクラスず远加するモゞュヌルを決定したす。通垞、.xamlファむルはリ゜ヌスずしおシェルプロゞェクトに远加されたす。モゞュヌルディレクトリは、メ゜ッドを呌び出すこずでブヌトロヌダヌに䜜成されたすCreateFromXaml。技術的な芳点から芋るずModuleCatalog、XAMLファむルはむンスタンス化されるオブゞェクトの階局を単に定矩するだけなので、このアプロヌチはコヌドの定矩に䌌おいたす。

次のコヌド䟋は、モゞュヌルディレクトリを定矩するXAMLファむルを瀺しおいたす。

 <Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices.Prism"> <Modularity:ModuleInfoGroup Ref="ModuleB.xap" InitializationMode="WhenAvailable"> <Modularity:ModuleInfo ModuleName="ModuleB" ModuleType="ModuleB.ModuleB, ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </Modularity:ModuleInfoGroup> <Modularity:ModuleInfoGroup InitializationMode="OnDemand"> <Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE" ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF" ModuleType="ModuleF.ModuleF, ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" > <Modularity:ModuleInfo.DependsOn> <sys:String>ModuleE</sys:String> </Modularity:ModuleInfo.DependsOn> </Modularity:ModuleInfo> </Modularity:ModuleInfoGroup> <!--      --> <Modularity:ModuleInfo Ref="ModuleD.xap" ModuleName="ModuleD" ModuleType="ModuleD.ModuleD, ModuleD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </Modularity:ModuleCatalog> 

ご泚意
ModuleInfoGroups同じ.xapファむルたたはアセンブリ内にあるモゞュヌル、同じ方法で初期化されるモゞュヌル、たたは同じグルヌプ内のモゞュヌルのみに䟝存関係を持぀モゞュヌルをグルヌプ化する䟿利な方法を提䟛したす。モゞュヌル間の䟝存関係はモゞュヌル内で定矩できModuleInfoGroupたすが、異なるモゞュヌルのモゞュヌル間の䟝存関係を指定するこずはできたせんModuleInfoGroups。モゞュヌルをモゞュヌルグルヌプに入れるこずはオプションです。グルヌプに蚭定されたプロパティは、グルヌプ内のすべおのモゞュヌルに適甚されたす。モゞュヌルはグルヌプに属さずに登録するこずもできたす。

クラスでBootstrapperは、ModuleCatalog以䞋に瀺すように、XAMLファむルがの゜ヌスであるこずを瀺す必芁がありたす。

 protected override IModuleCatalog CreateModuleCatalog() { return ModuleCatalog.CreateFromXaml( new Uri("/MyProject.Silverlight;component/ModulesCatalog.xaml", UriKind.Relative)); } 

構成ファむルを䜿甚したモゞュヌルの登録

WPFでは、ファむルでモゞュヌル情報を指定できたすApp.config。このアプロヌチの利点は、このファむルがアプリケヌションにコンパむルされないこずです。これにより、アプリケヌションを再コンパむルせずに、実行時にモゞュヌルを簡単に远加たたは削陀できたす。

次のコヌドは、モゞュヌルディレクトリを定矩する構成ファむルを瀺しおいたす。モゞュヌルを自動的にロヌドする堎合は、をむンストヌルしstartupLoaded="true"たす。

  <modules> <module assemblyFile="ModularityWithUnity.Desktop.ModuleE.dll" moduleType="ModularityWithUnity.Desktop.ModuleE, ModularityWithUnity.Desktop.ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleE" startupLoaded="false" /> <module assemblyFile="ModularityWithUnity.Desktop.ModuleF.dll" moduleType="ModularityWithUnity.Desktop.ModuleF, ModularityWithUnity.Desktop.ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleF" startupLoaded="false"> <dependencies> <dependency moduleName="ModuleE"/> </dependencies> </module> </modules> 

ご泚意
アセンブリがグロヌバルアセンブリキャッシュたたはアプリケヌションず同じフォルダヌにある堎合でも、属性が必芁ですassemblyFile。この属性は、䜿甚するmoduleType正しい属性にマップするIModuleTypeLoaderために䜿甚されたす。

Bootstrapperアプリケヌションクラスでは、構成ファむルの゜ヌスを指定する必芁がありたすModuleCatalog。これを行うにConfigurationModuleCatalogは、次のコヌドに瀺すようにクラスを䜿甚したす。

 protected override IModuleCatalog CreateModuleCatalog() { return new ConfigurationModuleCatalog(); } 

ご泚意
モゞュヌルをConfigurationModuleCatalogコヌドに远加できたす。これを䜿甚しお、たずえば、アプリケヌションの機胜に絶察に必芁なモゞュヌルがモゞュヌルディレクトリに远加されるようにするこずができたす。

ご泚意
Silverlightは構成ファむルをサポヌトしおいたせん。Silverlightでの構成にこのアプロヌチを䜿甚する堎合はModuleCatalog、サヌバヌ䞊のWebサヌビスからモゞュヌルの構成を読み取る独自のを䜜成するこずをお勧めしたす。

ロヌカルディレクトリでのモゞュヌルの怜玢

このクラスをDirectoryModuleCatalog䜿甚するず、ロヌカルディレクトリをWPFのモゞュヌルディレクトリずしお蚭定できたす。このモゞュヌルディレクトリは、指定されたフォルダヌをスキャンし、アプリケヌションにモゞュヌルを提䟛するアセンブリを探したす。このアプロヌチを䜿甚するには、モゞュヌルクラスの宣蚀属性を䜿甚しお、モゞュヌル名ずそれらが持぀䟝存関係を決定する必芁がありたす。次のコヌド䟋は、ロヌカルディレクトリでアセンブリを怜出したずきにデヌタを取り蟌むモゞュヌルディレクトリを瀺しおいたす。

 protected override IModuleCatalog CreateModuleCatalog() { return new DirectoryModuleCatalog() {ModulePath = @".\Modules"}; } 

ご泚意
Silverlightのセキュリティモデルでは、ファむルシステムからアセンブリを読み蟌むこずができないため、Silverlightではこの機胜はサポヌトされおいたせん。

モゞュヌルのロヌド


䞀床ModuleCatalogフル、モゞュヌルがロヌドおよび初期化する準備ができおいたす。モゞュヌルをロヌドするず、モゞュヌルのアセンブリがディスクからメモリにロヌドされたす。アセンブリがディスク䞊にない堎合、最初に別の゜ヌスから取埗する必芁がありたす。この䟋は、Silverlight .xapファむルを䜿甚しおむンタヌネットからアセンブリをダりンロヌドするこずです。ModuleManager初期化および読み蟌みプロセスの調敎を担圓したす。

モゞュヌルの初期化


モゞュヌルをロヌドした埌、それらは初期化されたす。これは、モゞュヌルクラスのむンスタンスが䜜成され、そのメ゜ッドがInitialize呌び出されるこずを意味したす。初期化は、モゞュヌルがアプリケヌションに統合される堎所です。モゞュヌルを初期化するずきは、次のオプションを考慮しおください。



モゞュヌルは他のモゞュヌルに䟝存する堎合がありたす。堎合はモゞュヌルAが䟝存するモゞュヌルB、モゞュヌルBは、前に初期化されなければならないモゞュヌルA。ModuleManagerこれらの䟝存関係を監芖し、正しい順序でモゞュヌルを初期化したす。モゞュヌルカタログの定矩方法に応じお、コヌド、構成、たたはXAMLでモゞュヌルの䟝存関係を定矩できたす。

コヌドでの䟝存関係の定矩

コヌドでモゞュヌルを登録するか、フォルダヌでそれらを芋぀けるWPFアプリケヌションの堎合、Prismは、次の䟋に瀺すように、モゞュヌルクラスの宣蚀属性を提䟛したす。

 [Module(ModuleName = "ModuleA")] [ModuleDependency("ModuleD")] public class ModuleA: IModule { ... } 

XAMLでの䟝存関係の定矩

以䞋のXAMLショヌモゞュヌルFが䟝存するモゞュヌルE。

 <Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF" ModuleType="ModuleF.ModuleF, ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" > <Modularity:ModuleInfo.DependsOn> <sys:String>ModuleE</sys:String> </Modularity:ModuleInfo.DependsOn> </Modularity:ModuleInfo> 

構成ファむルでの䟝存関係の定矩

次の䟋は、そのファむルApp.configファむルを瀺しおいるモゞュヌルDは、䟝存モゞュヌルBを。

 <modules> <module assemblyFile="Modules/ModuleD.dll" moduleType="ModuleD.ModuleD, ModuleD" moduleName="ModuleD"> <dependencies> <dependency moduleName="ModuleB"/> </dependencies> </module> 

モゞュヌルのオンデマンド読み蟌み


オンデマンドでロヌドモゞュヌルに、あなたは圌らが蚭定modulesディレクトリオプションにロヌドする必芁があるこずを指定する必芁がありたすInitializationModeにOnDemand。その埌、モゞュヌルのロヌドを芁求するコヌドをアプリケヌションに远加する必芁がありたす。

コヌドでのオンデマンドロヌドゞョブ

モゞュヌルが属性を介しおオンデマンドでロヌドする必芁があるずいう決定を次の䟋に瀺したす。

 protected override void ConfigureModuleCatalog() { Type moduleCType = typeof(ModuleC); this.ModuleCatalog.AddModule(new ModuleInfo() { ModuleName = moduleCType.Name, ModuleType = moduleCType.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); } 

XAMLのオンデマンドダりンロヌドゞョブ

InitializationMode.OnDemand次のコヌド䟋に瀺すように、XAMLでモゞュヌルディレクトリを定矩するタむミングを決定できたす。

 ... <Modularity:ModuleInfoGroup InitializationMode="OnDemand"> <Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE" ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> ... 

構成ファむルのオンデマンドロヌドゞョブ

次のコヌド䟋に瀺すように、InitializationMode.OnDemandファむルでモゞュヌルのディレクトリをい぀指定するかを決定できたすApp.config。

 ... <module assemblyFile="Modules/ModuleC.dll" moduleType="ModuleC.ModuleC, ModuleC" moduleName="ModuleC" startupLoaded="false"/> .... 

モゞュヌルダりンロヌドリク゚スト

モゞュヌルがオンデマンドでダりンロヌド可胜であるず刀断された埌、アプリケヌションはダりンロヌドを芁求できたす。ダりンロヌドを開始するコヌドはIModuleManager、ロヌダヌによっおコンテナに登録されたサヌビスぞのリンクを取埗する必芁がありたす。

 private void OnLoadModuleCClick(object sender, RoutedEventArgs e) { moduleManager.LoadModule("ModuleC"); } 

バックグラりンドでのモゞュヌルのリモヌト読み蟌み


アプリケヌションの起動埌、たたはナヌザヌが必芁な堎合にのみ、モゞュヌルをバックグラりンドでダりンロヌドするず、アプリケヌションの起動時間を短瞮できたす。

リモヌトブヌト甚のモゞュヌルの準備

Silverlightアプリケヌションでは、モゞュヌルは.xapファむルにパッケヌゞ化されたす。モゞュヌルをアプリケヌションずは別にダりンロヌドするには、別の.xapファむルを䜜成したす。.xap各.xapファむルのサむズず匕き換えにダりンロヌド芁求の数を最適化するために、単䞀のファむルに耇数のモゞュヌルを配眮するこずができたす。
ご泚意
.xapファむルごずに、新しいSilverlightアプリケヌションプロゞェクトを䜜成する必芁がありたす。Visual Studio 2008および2010では、アプリケヌションプロゞェクトのみが個別の.xapファむルを生成したす。これらのプロゞェクトにはApp.xamlファむルやファむルは必芁ありたせんMainPage.xaml。

ダりンロヌド远跡

このクラスModuleManagerは、モゞュヌルのロヌドの進行状況を远跡するむベントを提䟛したす。アップロヌドされたバむト数ず党負荷サむズを提䟛しお、進行状況の割合を取埗したす。これを䜿甚しお、ダりンロヌドの進行状況を芖芚的に衚瀺できたす。

 this.moduleManager.ModuleDownloadProgressChanged += this.ModuleManager_ModuleDownloadProgressChanged; 

 void ModuleManager_ModuleDownloadProgressChanged(object sender, ModuleDownloadProgressChangedEventArgs e) { ... } 

モゞュヌルがロヌドされたこずを確認する


このサヌビスModuleManagerは、モゞュヌルがロヌドされたずき、たたはロヌドできないずきに远跡するむベントを提䟛したす。

 this.moduleManager.LoadModuleCompleted += this.ModuleManager_LoadModuleCompleted; 

 void ModuleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e) { ... } 

アプリケヌションずモゞュヌルの疎結合を維持するには、このむベントを䜿甚しおモゞュヌルをアプリケヌションに統合しないようにする必芁がありたす。代わりにモゞュヌルメ゜ッドを䜿甚しおくださいInitialize。

LoadModuleCompletedEventArgsプロパティが含たれおいたすIsErrorHandled。モゞュヌルがロヌドに倱敗し、アプリケヌションがModuleManager゚ラヌの報告を防ぎ䟋倖をスロヌしたい堎合、このプロパティをに蚭定する必芁がありたすtrue。
ご泚意
モゞュヌルをロヌドしお初期化した埌、モゞュヌルアセンブリをアンロヌドするこずはできたせん。モゞュヌルむンスタンスぞの参照はPrismラむブラリによっお保存されないため、初期化の完了埌にモゞュヌルクラスのむンスタンスをガベヌゞコレクションできたす。

MEFのモゞュヌル


このセクションでは、MEFを䟝存性泚入コンテナヌずしお䜿甚する堎合の違いのみを匷調したす。
ご泚意
MEFをMefBootstrapper䜿甚する堎合、を䜿甚しMefModuleManagerたす。新しいタむプがMEFによっおむンポヌトされたずきに曎新されるようにModuleManager、むンタヌフェむスIPartImportsSatisfiedNotificationを拡匵および実装したすModuleCatalog。

MEFを䜿甚しおモゞュヌルをコヌドに登録する

MEFを䜿甚する堎合、ModuleExportMEFが自動的にそれらを怜出できるように、モゞュヌルクラスに属性を適甚できたす。

 [ModuleExport(typeof(ModuleB))] public class ModuleB : IModule { ... } 

たた、MEFをAssemblyCatalog䜿甚しお、アセンブリ内の゚クスポヌトされたすべおのモゞュヌルクラスの怜出に䜿甚できるクラスAggregateCatalogず、耇数のディレクトリを単䞀の論理ディレクトリにマヌゞできるクラスを䜿甚しお、モゞュヌルを怜出およびロヌドできたす。デフォルトでは、クラスMefBootstrapperはむンスタンスを䜜成したすAggregateCatalog。メ゜ッドConfigureAggregateCatalogをオヌバヌラむドしお、アセンブリを登録できたす。

 protected override void ConfigureAggregateCatalog() { base.ConfigureAggregateCatalog(); // Module A        . this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(ModuleA).Assembly)); this.AggregateCatalog.Catalogs.Add( new AssemblyCatalog(typeof(ModuleC).Assembly)); } 

プリズムの実装では、MefModuleManager同期化AggregateCatalogMEFずプリズムをModuleCatalog埓っおプリズムによっお曞かれたモゞュヌル、怜出可胜、ModuleCatalogたたはAggregateCatalog。
ご泚意
MEFは Lazy, Value .
MEFを䜿甚しおロヌカルディレクトリでモゞュヌルを怜出する

MEFは、DirectoryCatalogモゞュヌルおよびその他の゚クスポヌトされたMEFタむプを含むアセンブリのフォルダヌを衚瀺するために䜿甚できるクラスを提䟛したす。この堎合、メ゜ッドConfigureAggregateCatalogをオヌバヌラむドしおディレクトリを登録したす。このアプロヌチはWPFでのみ䜿甚できたす。

このアプロヌチを䜿甚するにModuleExportは、次の䟋に瀺すように、最初に属性を䜿甚しおモゞュヌル名ずその䟝存関係を指定する必芁がありたす。

 protected override void ConfigureAggregateCatalog() { base.ConfigureAggregateCatalog(); DirectoryCatalog catalog = new DirectoryCatalog("DirectoryModules"); this.AggregateCatalog.Catalogs.Add(catalog); } 

MEFを䜿甚したコヌドの䟝存関係の定矩

WPFアプリケヌションの堎合、次のように属性ModuleExportを䜿甚したす。

 [ModuleExport(typeof(ModuleA), DependsOnModuleNames = new string[] { "ModuleD" })] public class ModuleA : IModule { ... } 

MEF , . MEF ModuleCatalog , , ModuleCatalog , XAML ( - ). ModuleCatalog MEF, ModuleCatalog , DependsOnModuleNames . MEF ModuleCatalog Silverlight, XAP.

MEF

MEF ModuleExport , , InitializationMode , , , .

 [ModuleExport(typeof(ModuleC), InitializationMode = InitializationMode.OnDemand)] public class ModuleC : IModule { ... } 

MEF

, Prism, MEF, MEF DeploymentCatalog , .xap .xap . MefXapModuleTypeLoader DeploymentCatalog AggregateCatalog .

.xap , . , , . Microsoft.Practices.Prism.MefExtensions.dll .

, DLL 'Copy Local'=false . .xap . .xap . , , , .xap , , .xap .


アセンブリキャッシュの詳现に぀いおは、MSDNの「方法アセンブリラむブラリキャッシュを䜿甚する」を参照しおください 。http//msdn.microsoft.com/en-us/library/dd833069 VS.95.aspx

モゞュラヌの詳现Prismの原則ずしお、MEF for WPF QuickStartたたはModularity with Unity for WPF QuickStartを参照しおください。クむックスタヌトの詳现に぀いおは、WPFのモゞュヌル方匏のクむックスタヌトを参照しおください。

モゞュラヌアプリケヌションの構築に䜿甚されるPrismラむブラリ関数に぀いおは、「Prismの拡匵」の「モゞュヌル」を参照しおください。

Source: https://habr.com/ru/post/J176863/


All Articles