Stock Trader Reference Implementation Using the Prism Library 5.0 for WPF(原文)
※サンプルコードのダウンロードは、原文リンクから行ってください。
パターンと実践 ディベロパー・センター
Microsoft Prism Library 5.0 for WPFの開発者のガイドから:
Prismには、参考になる実装と呼ばれるサンプルが含まれています。これは、実際の使い方に基づく複合アプリケーションです。 この意図的に不完全なアプリケーションは、複合アプリケーションの基本的なアーキテクチャを説明しています。 アプリケーションの内では、あなたは、開発者が、複合アプリケーションを作成するとき、直面する、 一般的な、そして、繰り返し起こる難問のためのソリューションを見るでしょう。私たちは、Model-View-ViewModel(MVVM)、複合View、 イベント・アグリゲータ、プラグインのような、デザイン・パターンを使用して、難問の多くを解決します。 そして、依存関係注入は、分離の重要性と疎結合のような、重要な構造的なデザインの原則を実現します。 Prismは、あなたが、モジュール・アプリケーション・デザインを作成するのを助けます。 そして、構築されたアプリケーションは、疎く結合したコンポーネントを使用しています。それは、独立して進化することができます。 しかし、それは、全体的なアプリケーションに、簡単に、継ぎ目なく、統合することができます。
参考になる実装は、実際のアプリケーションではありません。; しかしながら、それは、顧客が取り組んでいる実際の難問に基づいています。あなたが、このアプリケーションを調べるとき、 株トレーダー・アプリケーションを構築することのための基準点として、それを調べません。 -その代わりに、複合アプリケーションを構築するための参照として、調べます。
備考
このアプリケーションを調べるとき、それが実装された方法で、それを実装することは、不適当に思われるかもしれません。 例えば、あなたは、なぜ、それほど多くのモジュールがあるのか、疑問に思うかもしれません。 そして、それは、複雑すぎるように思われるかもしれません。 Prismの焦点は、複合アプリケーションを構築する周辺の難問に対処することです。 この理由のため、特定の使い方では、それらの難問を強調するために、参考になる実装が使用されています。
次に示す図は、株トレーダーのリファレンス実装(株トレーダーRI)のデスクトップ版を示しています。
株トレーダーRI
あなたは、異なる方法で参考になる実装を使用できます。あなたは、実行している例をステップ実行することができます。 それは、再使用できる手引きの上で、構築されるアプリケーション固有のコードを説明します。 また、あなたは、ソース・コードの項目をコピーすることができます。あなた独自のアプリケーションに、個々の手引きを実装します。
参考になる実装は、「テスト駆動」の方法を使用して開発されました。 そして、そのコンポーネントの大部分に、自動化(ユニット)テストが含まれています。 あなたは、参考になる実装を変更することができます。 そして、その機能を確かめる単体テストを使用します。 Prism 5.0リリースのための参考になる実装は、更新されたPrismライブラリのいくつかの鍵となるフィーチャを説明します。:
- 依存関係注入コンテナとしての拡張管理フレームワーク(MEF)
- カスタム属性を通したモジュール方式とユーザー・インターフェイス(UI)構成
- Model-View-ViewModelのパターン(MVVM)
- 領域に基づくナビゲーション
参考になる実装を構築して、そして、実行する
Building and Running the Reference Implementation
株トレーダーRIは、Visual Studio 2012、あるいは、それ以降と.NET Framework 4.5.1を必要とします。 参考になる実装は、Blend for Visual Studio 2013(原文)と互換性を持ちます。
Windows Explorerで、株トレーダーRIを実行するために、
To see the pie chart and line chart for each stock
Visual Studioで、次に示すショートカット・ファイルを、ソリューションを開くために、ダブルクリックします。:
- RI-StockTraderを参照する、Implementation.lnkを開きます。
- F5を押します。
参考になる実装で相互作用する
Interacting with the Reference Implementation
株トレーダーの参考になる実装の特徴は、後半の使い方の項目で、より詳細に取り扱われます。 次の手順は、基本的な機能の簡単な紹介を提供します。
各々の株のための円グラフと折れ線グラフを表示するには、
- Positionタブをクリックします。
- Position表で、あなたが、円グラフと折れ線グラフを確かめたい株の該当する行をクリックします。
株の該当するニュース記事を確かめるために、
To add a stock to the watch list
- Positionタブをクリックします。
- Position表で、あなたが、より詳細を知りたいと望む株の該当する株をクリックします。
- ニュース記事をクリックします。あなたが、右上角のコントロールをクリックすると、ニュースリーダー・ダイアログボックスを開きます。
株を監視リストに追加します。
To remove a stock from the watch list
- 監視リストボックスを追加することで、株のための株の記号を入力します。 あなたは、監視リストに追加することを望みます。 有効な値は、株式の記号として、STOCK9を通して、STOCK0が含まれています。
- Enterを押します。
監視リストから株を削除します
To remove a stock from the watch list
- 監視リスト・ボタンをクリックします。
- 監視リストで、あなたが削除したい株の隣にある、X記号をクリックします。
ストックから株を買うまたは売却するには、
- 位置の領域で、あなたが、売り買いしたい、株の隣りにある+あるいは-記号をクリックします。
- 売買領域では、次に示すデータを入力します:
- 株式ボックスでは、あなたが売り買いしたい株式の数を入力します。
- 価格の制限ボックスでは、適切な価格を入力します。
- ドロップダウン・ボックス、制限、市場や停止をクリックし、順番に入力します。
- 期間ボックスで、日、あるいは、30日の終わりをクリックします。 期間は、それが実行される、あるいは、それが期限切れになる前に、注文が有効な時間の長さです。
- 注文を送信するために、Submitボタンをクリックします。注文をキャンセルするために、Cancelボタンをクリックします。
送信するか、あなたのすべての買いと売りの注文をキャンセルします。
To submit or cancel all your buy and sell orders
- l あなたが、売り買いされる準備ができている複数の注文を持っている場合、 Submit All と Cancel All ボタンは、売買領域の上、そして、中心となるタスクバーで有効にされます。 すべてのそれぞれの注文が、送信できる場合だけ、Submit Allボタンは有効にされます。
次に示す図は、株トレーダーRIの売買タブを示しています。
株トレーダーRIの売買領域
受入検査
Acceptance Tests
株トレーダーRIには、受入検査が含まれる、分離したソリューションが含まれています。 あなたが、一連の手順に従うとき、受入検査では、参考になる実装がどのように作動しなければならないかを説明します。 あなたは、さまざまな使い方をする、アプリケーションの機能の挙動を調べるために、受入検査を使用することができます。
結論
Outcome
あなたは、株トレーダーRIのシェルウィンドウを確かめる必要があり、そして、テストは、アプリケーションと自動的に対話します。 テストが渡された最後に、あなたは、すべてのテストが渡されたことを確かめる必要があります。
筋書き
The Scenario
株トレーダーRIは、架空のものを説明しますが、現実的な金融投資シナリオです。 Contoso社の金融投資(CFI)は、実際の金融機関をモデルにしている、架空の金融機関です。 CFIは、彼らの株式トレーダーで使用するために、新しい複合アプリケーションを構築しています。 このトピックは、シナリオの概要が含まれており、ビジネス上の動機を説明します。 それは、一連の技術的な説明は、Prismを使用して、最終的な結果を導きます。
Contoso社の金融投資シナリオ
Contoso Financial Investments Scenario
Contoso金融投資(CFI)は、100人のトレーダーが所属する、グローバル投資会社です。 CFIで行われる事業の中心は、Microsoft Foundationalクラス・ライブラリーとVisual C++で開発された、 15年使用された、レガシー・トレーダー・アプリケーションがあります。 それは、時間とともに、維持するのがますます難しくなりました。
操作環境
Operating Environment
最後の数年間、CFIの保守性の欠如は、アプリケーションの行き詰りのため、新しい開発をもたらしました。 -これは、アプリケーションの保守モード中に、残っています。 新規の顧客の要件を満たすために、CFIは、Microsoft .NET Framework開発プラットホームを採用し、 分岐し、サイロ内の別々のチームによって、それぞれ維持される、追加のアプリケーションを作成します。 別々に開発されたアプリケーションが、実際に、開発作業内で、より効率的な結果を生じるアイデアを持っています。 各々のチームは、それら独自のサイロで開発することで、CFIは、起こるかもしれない、 どんな競合でも取り除くことができることを意味します。そして、それは、新しいチームを簡単に作成することができます。 これは、CFIが、いくつかの場所に、それらの開発チームを増やすことができます。 いくつかのオフショア・チームを設立することが含まれています。
厳しい現実は、この方法は、いくつかのレベル上で、極めて能率が悪いことがわかったということです。 各々のアプリケーションが、サイロで開発されたため、トレーダーは、現在、アプリケーションの成長する組合せで、 同じデータの複数のコピーを維持することが必要とされています。StockPortfolio、MarketViewとStockHistが含まれています。 データは、同一でありませんが、重複したデータの要素があります。それらの作業を行うために、 トレーダーは、常に、これらのさまざまなアプリケーション間で、行ったり来たり移動します。 これを支援するために、CFIは、中央の場所から、すべてのアプリケーションを、 すばやく起動するために「ランチャー」を使用しました。また、ランチャーは、アプリケーションに、 各々のアプリケーションのためのログオン画面をスキップするために、ユーザーのログオン証明書を渡します。 ランチャーは、他に何かに比べてより制限されています。 それは、アプリケーションは、その中で、同一のUIをサポートしない、他のものを統合することできないので、 トレーダーの総合的な作業の流れを、あまり改善しませんでした。
操作上の難問
Operational Challenges
統合の欠如のため、すべての関連データの統合ビューを取得することは、簡単な作業ではありません。 顧客向けのレポート・サイトがあります。それは、この「1つの」Viewを作成するために、 バックエンドシステムの各々から引き出すことができます。 しかし、それは問題が、散らばっています。少なくとも、データが、適切に複製されなかった場合、 レポートは、動作しません。加えて、重複データの入力は、極めて時間がかかり、 トレーダーが、それを、処理しているため、注文の数に著しい影響を与えます。 データを手動で入力することで、システムに、多くのエラーを発生させました。 スキーマーが、極めて異なっており、そして、頻繁に変更されるため、 自動的に異なるシステムを同期させる試みは、あまりに高くつきました。 これら、すべての問題で、CFIは、他の多くの事業と同様に、なんとか、黒字事業として、運営し続けることができました。 利用者の要求が増加して、CFIは、そのサービスを展開するために、必要な資金を投資しました。 また、能率が悪い、作業条件のため、誰かの仕事が、ますます難しくなりましたが、 それは、一貫して、取引力を発達させました。 最近、しかしながら、この非効率性は、事業がお金を失い始めているために、適切に増加しました。:
- トランザクションごとの相互作用時間は、アプリケーションの組合せを操作する時間のため、大幅に増加しました。
- 従業員訓練と企業内サポートの費用は、高度な複雑さとアプリケーションの一貫性が不足しているため、はるかに増加しました。
- さまざまなアプリケーションの維持費は、極めて高額です。 例えば、最近の事例では、発見された論理的なバグは、異なる7つのシステムの変更を必要としました。 この重大なバグは、システムの他の部分が、バグが存在したコードに大きく依存していたため、修正するために、3週間かかりました。 これは、それを修正して、それを検証して、それを配布する費用を非常に増加させました。 -それは、総額150,000ドルをもたらしました。これは、元の修正の一部として作成された、 3つの追加のバグを修正するための、労力も含まれています。
- l CFIは、新しい技術に追いつくことができませんでした。 それは、それに、競争上の優位性と低減した開発費を提供することができます。
新しい必要条件
Emerging Requirements
現在、CFIは、サービス指向アーキテクチャ(SOA)周辺で、新しい難問に直面しています。 CFIの主要な競争相手の1つ、Fabrikam Webトレーダーは、サイト上のリモート環境で、 かれらのポートフォリオを管理するための高機能なクライアント・デスクトップ経験を、 その顧客に提供しています。クライアントは、Webサービスによって、 Fabrikamのバックエンドシステムを呼び出すことができます。 いくつかの大規模なCFIの顧客は、現在、同じ機能を要求しています。
差し迫った脅威ではありませんが、長期的に、ビジネスへの影響は、壊滅的です。 CFIが、現在の戦略を続け、そして、その両方の効率を改善しない、そして、市場の変化に適応しない場合、 その競争で、ビジネスを失うことになります。
ビジネスとITの目標を達成する
Meeting the Business and IT Objectives
経営最高責任者(CEO)は、CFIが、上昇を引き起こすための機会として、この難問を認識する日和見主義者です。 情報統括役員(CIO)と最高技術責任者(CTO)は作業します。 彼らは、CFIを前に進めるため、三つの戦略を考案します。戦略は以下の通りです:
- 開発の費用を削減します。これを実行するには、新システムは、次の事を行う必要があります。:
- 明確に定義されたアーキテクチャを通して、共同製作するためチームのために、構造を提供する必要があります。
- それは、分散型のチームをサポートする必要があります。何人かのオフショア開発者を使用することが含まれています。
- それは、より短い開発ライフサイクルを提供する必要があります。-これは、市場投入までの時間が短縮されます。
- それは、さまざまな方法で、データを示す必要があり、それは、以前、実装するために、法外に高く、時間がかかりました。
- それは、テスト駆動開発(TDD)をサポートする必要があります。
- それは、自動受入検査をサポートする必要があります。
- それは、サードパーティ製のシステムとの統合をサポートする必要があります。
- トレーダーの効率を改善します。これを達成するために、システムは、次の事を行う必要があります。:
- それは、より優れたマルチタスクをサポートする必要があります。
- それは、トレーダーの作業の流れに合わせた、より優れたUIを提供する必要があります。
- これは、既存のアプリケーションを統合する必要があります。
- それは、トランザクション(データの視覚化)あたりの、より短いインタラクション時間を提供する必要があります。
- それは、より優れた情報の流れ(文脈上のUIのキュー)を提供する必要あります。
- それは、画面範囲のより優れた利用を提供する必要があります(また、これは、画面実際の状態として知られています)。
- それは、システムの異なるコンポーネントの間で、そして、外部コンポーネント(サービス)で、統合する必要があります。
- それは、学習時間の削減を提供する必要があります。
- それは、遠隔操作で配置されるているか、敷地内かどうかに関係なく、ユーザーをサポートする必要があります。
- それは、会社商標を付けたUIスタイルをサポートする必要があります。
- それは、新しい機能をシステムに加える費用を最小限にする必要があります。
- それは、顧客やサードパーティ企業により提供される、カスタム拡張機能のいずれかの追加をサポートする必要があります。
- 新規の顧客向け製品の提供を作成します。この提供は、次の事を行う必要があります。:
- それは、ポートフォリオ管理のための、高機能なクライアント・デスクトップ経験が含まれている必要があります。
- それは競争に打ち勝つために、UIのカスタマイズや企業のブランディングを提供する必要があります。
- それは、サードパーティ・ベンダーのための拡張性を提供する必要があります。
CTOは、それらを提供するために、さまざまなオプションを調べている上級設計者に、これらの必要条件を提供しました。
開発の難問
Development Challenges
設計者のために、このプロジェクトは、CFIの技術環境で最も重要な変更を示します。 作業は、いくつかのソフトウェア開発チームに渡って分散されており、加えて、追加の開発を外部委託しています。 過去には、開発チームの間の協力は、制限されていました。 そして、開発は、特別な原則で発生する傾向がありました。 これは、彼が、現在の開発技法の結果、次の問題を確認したためです。:
- 不整合。同じようなアプリケーションが、異なる方法で開発されます。 これは、より高いメンテナンスと学習費用を結果として生じます。
- 様々な品質。様々なレベルの経験をもつ開発者は、実証済みの慣行を実装することに、案内が不足しています。 この状況は、彼らが作成するアプリケーションの間で、むらのある品質を結果として生じます。
- 低い生産性。多くの場合、企業の中の開発者は、異なるアプリケーションにおいて、 コードは、ほとんど、あるいは、全く再使用せず、同じ問題を繰り返し解決します。 中心的な設計が存在しないため、 それは、お互いに、情報をやりとりするアプリケーションを手に入れることが、極めて困難です。
ソリューション:Prism
The Solution: Prism
上級設計者は、先の項目で、記載された設計上の展望を実現するために、 そして、確認された開発上の難問を解決するために、戦略を必要とします。 かなり調査した後、彼は、最も良いソリューションが、 Microsoft patterns & practices groupで提供されるPrismで見つかると、判断しました。
Prismは、複雑なWPFアプリケーションを構築することのための一揃いの資産です。 Prismは、以下のようにして、複合アプリケーションの設計を可能にします。:
- これは、侵襲しない軽量なAPIを通じて、WPFの複合アプリケーションを開発、そして、保守するための基盤構造とサポートを提供します。
- それは、UIコンポーネントを動的に構成します。
- これは、別々のチームによって、開発され、検証され、そして、配布されるアプリケーション・モジュールをサポートします。
- これは、インクリメンタル導入ができます。
- それは、統合され、そして、一貫したユーザー経験を提供します。
- それは、既存のWPFアプリケーションと統合することができます。
- それは、複数を対象とする使いかたをサポートしています。
Microsoft patterns & practicesから、Prismは、CFIの必要条件を満たしています。 そして、極めて効果的に、そして、予測可能な開発をすることによって、それらの目標を達成できるようにする必要があります。 CFIが、最近の顧客の要求に対処するために、最近いくつかのWPFアプリケーションを開発したため、 既存のWPFアプリケーションと統合するためのサポートは、設計者に特に重要です。 彼は、案内が、効果的な解決策を提供し、彼を支援すると、確信しています。 それは、強健で、信頼できて、実証済みの慣行に基づき、そして、それはWPFを一番使用することができます。 CTOに、彼の調査結果を紹介した後、CTOは、Prismが、効果的に、 そして、コスト効率よくソリューションを提供するために、役に立つと同意するでしょう。 彼は、計画を進行するための承認を与えます。
株トレーダーRIフィーチャ
Stock Trader RI Features
CFIの株トレーダー・アプリケーションは、トレーダーの投資のポートフォリオを管理するために使用されています。 株トレーダー・アプリケーションを使用して、トレーダーは、それらのポートフォリオを確かめ、傾向データを表示し、株式を売り買いし、 それらの項目の中の監視リストと表示と関連したニュースを管理することができます。
株トレーダーRIは、次の動作をサポートしています。:
- 各々の株のための円グラフと折れ線グラフを参照してください。
- 株に対応するニュース記事を参照してください。
- 監視リストに、株を追加します。
- 監視リストを見ます。
- 監視リストから株を削除します
- ストックから株を売り買いする。
- あなたの全体の買いと売りの注文を送信する、あるいは、キャンセルします。
論理アーキテクチャ
Logical Architecture
次に示す図は、株トレーダーRIの高水準の論理アーキテクチャのビューを示しています。
株トレーダーRIの設計上の考え
Architectural view of the Stock Trader RI
WPFのための株トレーダーRIuses Prismライブラリ。
続いて、株トレーダーRIアーキテクチャの中心となる要素を説明します。:
- アプリケーション。アプリケーションは軽量で、そして、参考になる実装の範囲内で異なる、 UIコンポーネントの各々を格納するシェルが含まれています。 また、それには、コンテナを設立して、 モジュールの読み込みを初期化するStockTraderRIBootstrapperが含まれています。
- モジュール。ソリューションは、異なる場所で、別々のチームによって、
それぞれ保守される次の4つのモジュールに分割されます。:
- Watchモジュール。Watchモジュールは、Watch ListとAdd To Watch List機能が含まれています。
- Newsモジュール。Newsモジュールには、株式のニュース記事を取り出すことを取り扱うNewsFeedServiceが含まれています。
- Marketモジュール。Marketモジュールは、それらのポジションが変更したとき、 トレーダーのポジションのための市場動向データの検索を処理し、UIに通知します。 それは、同様に、選択されたポジションのためのTrendラインの埋め込みを処理します。
- Positionモジュール。Positionモジュールは、トレーダーのポートフォリオで、ポジションのリストの配置を処理します。 それは、同様に、売り買いの注文機能が含まれています。
- 基盤構造。基盤構造は、株トレーダーRIのための機能とPrismの中心の両方が含まれています。:
- Prismライブラリ。領域を取り扱う、命令、 そして、モジュールを読み込むための中心となる構成サービスとサービス・インターフェイスが含まれています。 また、それは、Unityアプリケーション・ブロック(Unity)のためのコンテナの外見とMEFが含まれています。 StockTraderRIBootstrapperは、MefBoostrapperから継承しています。
- 株トレーダーRI基盤構造ライブラリ。これは、株トレーダーRI、共有されたモデル、 そして、共有されたコマンドに、特別なサービス・インターフェイスが含まれています。
実装ビュー
Implementation View
株トレーダーRIは、Prismライブラリに基づいています。 次に示す図は、株トレーダーRI(デスクトップ版)のSolution Explorerを示しています。
株トレーダーRIソリューション・ビュー
株トレーダーRIが、どのように動作するか
How the Stock Trader RI Works
株トレーダーRIは、実行時に、初期化される一そろいのモジュールで構成されている複合アプリケーションです。 次に示す図は、モジュールの初期化が含まれている、アプリケーションの起動工程を示しています。 次の項目では、これらの各々の手順について、詳細に説明します。
株トレーダーRIの起動工程
株トレーダーRIの起動工程は、次の通りです。:
- アプリケーションは、StockTraderRIBootstrapperを使用します。 それは、その初期化のためのPrismライブラリのMefBootstrapperを継承します。
- アプリケーションは、モジュールで使用するために、PrismライブラリのMefServiceLocatorAdapterを初期化します。
- StockTraderRIBootstrapperは、シェル・ビューを作成し、そして、表示します。
- PrismライブラリのModuleCatalogは、アプリケーションが、読み込む必要があるすべてのモジュールを見つけます。
- PrismライブラリのModuleManagerは、各々のモジュールを読み込み、そして、初期化します。
- モジュールは、ビューを領域に追加するために、PrismライブラリのRegionManagerサービスを使用します。
- Prismライブラリの領域は、ビューを表示します。
モジュール。
Modules
モジュールは、アプリケーションの独立した論理ユニットです。 株トレーダーRIでは、各々のモジュールは、独立したアセンブリの中に存在します。 しかし、これは、絶対条件でありません。 分離させる利点は、より保守しやすいアプリケーションを作成すること、 そして、分散型のチームで、異なるモジュールと最小限の重複部分で作業することを可能にします。 ファイルのソース管理システムで更新されます。
アプリケーションは、各々のモジュールのシェル内から、ビューに、直接、挿入されません。; その代わりに、各々のモジュールは、内容をシェル・ビューに貢献し、 そして、他のモジュールと相互作用します。 最終的なシステムは、モジュールの貢献の集合体で構成されます。 構成を使用して、あなたは、突発的な動作で、アプリケーションを作成できます。 -これは、それが成長するにつれ、複雑さと要求で拡大できるアプリケーションを参照します。
モジュールは疎く結合しています。これは、それぞれ他と、直接、参照ないことを示しています。 それは、関係の分離を促進します。 そして、モジュールが、異なるチームによって、個別に開発し、検証し、配布できます。
サービスとコンテナ
Services and Containers
これは、モジュールが、アクセス権を持っているため、 一そろいのアプリケーション・サービスを通して、可能です。 モジュールは、これらのサービスを呼び出すために、互いを、直接、参照しません。 株トレーダーRIでは、(コンテナとして参照される)依存関係注入コンテナは、 それらを(株トレーダーRIは、MEFコンテナを使用して)初期化する間、 モジュール内に、これらのサービスを注入します。
備考
依存関係の注入とコントロールの反転についての基本的な事柄に関しては、MSDN MagazineのJames Kovacsによる、 Loosen Up-より可変的なアプリのため、 あなたのソフトウェア依存関係を抑制する(原文)の記事を参照してください。
アプリケーションを起動する。
Bootstrapping the Application
モジュールは、MefBootstrapperという名前のクラスによって、ブートストラップ工程の間に、初期化されます。 Prismライブラリで作成されたアプリケーションでは、MefBootstrapperは、 中心となる構成サービスの使用を開始するための役割を果たします。 MefBootstrapperクラスから、次のコードは、モジュール・マネージャーが、 コンテナから、どのように、配置されるかを示します。
C#
// MefBootstrapper.cs
protected override void InitializeModules()
{
IModuleManager manager = this.Container.GetExportedValue<IModuleManager>();
manager.Run();
}
モジュール管理者は、モジュール・カタログを検証する、モジュールを取り出す工程を管理します。 それらが、リモートの場合、アプリケーション・ドメインに、モジュールを読み込みます。 そして、IModule.Initializeメソッドを呼び出します。
総計のカタログを設定する
Configuring the Aggregate Catalog
StockTraderRIBootstrapperクラスは、コード内で、AggregateCatalogを構成します。 この場合、シェルは、すべてのモジュールに直接参照があります。 それで、StockTraderRIBootstrapperは、直接、それらをAggregateCatalogに追加する。 また、StockTraderRIBootstrapperは、カタログに、それ自身のアセンブリを追加します。 それで、アプリケーションに、エクスポートされる型は、コンテナ内で、利用できます。
C#
// StockTraderRIBootstrapper.cs
protected override void ConfigureAggregateCatalog()
{
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StockTraderRIBootstrapper).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StockTraderRICommands).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(MarketModule).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(PositionModule).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(WatchModule).Assembly));
this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(NewsModule).Assembly));
}
モジュールの読み込み
Module Loading
コンテナが埋め込まれたあと、各々のモジュールアセンブリ内に含まれる型が、利用できます。
備考
参照になる実装内の(NewsModuleのような)各々のモジュール・クラスは、空です。 MEFの使用は、宣言型の属性を使用して、型を発見できます。 それで、モジュールの初期化中に行われるべき、すべての作業がありません。 それが読み込まれるとき、追加の作業を行うために、モジュールが必要な場合、 モジュール・クラスは、続いて、Initializeメソッド内で、IModuleを実装し、 そして、この初期化を実行する必要があります。ModuleManagerは、 続いて、そのモジュールを発見し、読み込み、初期化します。
この初期化工程の間、コンテナは、それらの依存関係を解決するために、 インスタンスを型に注入できるでしょう。次に示すコードは、 ArticleViewModelコンストラクタに注入されるニュースフィード・サービス、 領域マネージャー、そして、イベント・アグリゲータ・サービスを、どのように表示するかを示します。
加えて、(サービスのような)他の型が、利用できます。 それで、それらは、疎く結合したスタイルで、同じモジュールや他のモジュールのどちらかで呼び出すことができます。
C#
// ArticleViewModel.cs
[Export(typeof(ArticleViewModel))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class ArticleViewModel : BindableBase
{
[ImportingConstructor]
public ArticleViewModel(INewsFeedService newsFeedService, IRegionManager regionManager, IEventAggregator eventAggregator)
{
...
}
}
View
Viewは、モジュールのどんな内容でも、UIに貢献します。株トレーダーRIでは、Viewは、実行時に発見され、そして、領域に加えられます。 領域は、ContentControlやTabControlのような、コントロールのコンテナで、関連付けられたクラスです。
備考
株トレーダーRIでは、Viewは、通常ユーザー・コントロールです。 しかしながら、WPF内のデータ・テンプレートは、Viewをレンダリングする別の方法です。
コンテナ内のViewの登録
View Registration in the Container
Viewは、宣言型の属性で、直接コードで、または、設定を通して登録することができます。 株トレーダーRIは、宣言型の属性の使いかたを説明する、MEFとMVVMパターンを使用します。 次のコードの例に示すように、Viewは、カスタム・エクスポート属性によって、領域にそれら自身を関連付けます。
C#
// ArticleViewModel.cs
[ViewExport(RegionName = RegionNames.ResearchRegion)]
[PartCreationPolicy(CreationPolicy.Shared)]
public partial class ArticleView : UserControl
株トレーダーRI基盤構造のAutoPopulateExportedViewsBehaviorは、コンテナでViewを発見します。 そして、次のコードの例に示すように、それらを自動的に、関連する領域に、埋め込みます。
C#
// AutoPopulateExportedViewsBehavior.cs
[ImportMany(AllowRecomposition = true)]
public Lazy<object, IViewRegionRegistration>[] RegisteredViews { get; set; }
public void OnImportsSatisfied()
{
AddRegisteredViews();
}
private void AddRegisteredViews()
{
if (this.Region != null)
{
foreach (var viewEntry in this.RegisteredViews)
{
if (viewEntry.Metadata.RegionName == this.Region.Name)
{
var view = viewEntry.Value;
if (!this.Region.Views.Contains(view))
{
this.Region.Add(view);
}
}
}
}
}
Model-View-ViewModel
株トレーダーRIは、MVVMパターンを、独立したUI、プレゼンテーション・ロジックとデータモデルに使用します。 MVVMを使用すると、それが、Viewについての直接的な知識を持っていないため、View Modelをユニットごとに検証できます。
Prismライブラリは、株トレーダーRIのView Modelが、通知するために、 ユーザー・インターフェイスのプロパティの変更を使用するBindableBaseクラスを提供します。 BindableBaseは、遥かに簡単に、INotifyPropertyChangedを実装します。
株トレーダーRIでは、ViewとView Modelは、View発見によって結合されています。 Viewは、AutoPopulateExportedViewsBehaviorで発見され、 そして、コンテナを通じてインスタンスを生成します。 次のコードの例に示すように、Viewが、View Modelのインポートを宣言するため、 コンテナは、続いて、View Modelのインスタンスを生成し、そして、それを、Viewに注入します。
C#
// ArticleView.xaml.cs
[Import]
ArticleViewModel ViewModel
{
set
{
this.DataContext = value;
}
}
View発見の詳細については、ユーザー・インターフェイスを構成する (原文)を参照してください。
コマンド
Commands
Viewは、コマンドを使用して、疎く結合したスタイルで、プレゼンターとサービスとやりとりできます。
次の図に示すように、新しい監視項目が追加された時は何時でも、WatchListServiceに通知するために、 DelegateCommandのAddWatchCommandを使用して、監視リスト・コントロールを追加します。
備考
DelegateCommandは、Prismライブラリによって提供される1種のコマンドです。 Prismのコマンドの詳細については、MVVMパターンを実装する (原文)内のコマンド (原文)を参照してください。
監視リスト・コントロールに追加する
Add To Watch List control
次のコードの例に示すように、DelegateCommandを使用することは、 サービスが、サービスのAddWatchメソッドに、コマンドのExecuteメソッドを委任することができます。
C#
// WatchListService.cs
public WatchListService(IMarketFeedService marketFeedService)
{
...
AddWatchCommand = new DelegateCommand<string>(AddWatch);
...
}
private void AddWatch(string tickerSymbol)
{
...
}
また、WatchListServiceは、AddWatchViewModelに注入されます。それは、コマンドをViewに公開します。
C#
// AddWatchViewModel.cs
public class AddWatchViewModel : BindableBase
{
private string stockSymbol;
private IWatchListService watchListService;
[ImportingConstructor]
public AddWatchViewModel(IWatchListService watchListService)
{
if (watchListService == null)
{
throw new ArgumentNullException("service");
}
this.watchListService = watchListService;
}
public string StockSymbol
{
get { return stockSymbol; }
set
{
SetProperty(ref stockSymbol, value);
}
}
public ICommand AddWatchCommand { get { return this.watchListService.AddWatchCommand; } }
}
ViewのAddWatchButtonは、続いて、DataContextを通して、AddWatchViewModelコマンドに結合します。
XAML
<!--AddWatchView.xaml -->
<StackPanel Orientation="Horizontal">
<TextBox Name="AddWatchTextBox" MinWidth="100" Style="{StaticResource CustomTextBoxStyle}"
Infrastructure:ReturnKey.Command="{Binding Path=AddWatchCommand}"
Infrastructure:ReturnKey.DefaultTextAfterCommandExecution="Add to Watch List"
Text="Add to Watch List"
AutomationProperties.AutomationId="TextBoxBlock" Margin="5,0,0,0"/>
</StackPanel>
これは、監視リスト・テキストボックスに追加に、添付したビヘイビアを使用することです。 それで、ユーザーが、株式の記号を入力し、そして、続いて、Enterを押すとき、AddWatchCommandが、呼び出されます。 それによって、WatchListServiceに、株式の記号を渡します。添付ビヘイビアの詳細については、 高等なMVVMの筋書き内のコマンドのビヘイビアを参照してください。
イベント・アグリゲータ
Event Aggregator
複数のオブジェクトから、単一のオブジェクトを通して、Event Aggregatorパターン・チャネル・イベントは、 クライアントのための登録を簡素化します。Prismライブラリでは、Event Aggregatorパターンのバリエーションは、 イベントを配置する、そして、配布する、あるいは、購読するために、複数のオブジェクトを提供します。
株トレーダーRIでは、イベント・アグリゲータは、モジュールの間で情報をやりとりするために使用されます。 サブスクライバは、UIスレッドで、通知を受けるイベント・アグリゲータを伝えます。 例えば、ユーザーが、Positionタブで記号を選択するとき、 次のコードの例に示すように、Positionモジュール内のPositionSummaryViewModelは、 選択された記号を指定するイベントを発生させます。
C#
// PositionSummaryViewModel.cs
eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Publish(CurrentPositionSummaryItem.TickerSymbol);
次のコードの例に示すように、NewsモジュールのArticleViewModelは、 選択された記号と関連づけられるニュースを表示するために、イベントに聞き取ります。
C#
// ArticleViewModel.cs
eventAggregator.GetEvent<TickerSymbolSelectedEvent>().Subscribe(OnTickerSymbolSelected, ThreadOption.UIThread);
備考
イベントの通知は、安全にUIを更新し、そして、WPFの例外を避けるためのUIスレッドです。
技術的な難問
Technical Challenges
株式のトレーダーの参考になる実装(株トレーダーRI)をデモします。 あなたは、一般的な技術的な難問に、どのように、対処する。 あなたは、あなたが、WPFで、複合アプリケーションを構築するとき、直面します。 次の表は、株トレーダーRIが、対処するために、技術的な難問を説明します。
技術的な難問 | 株トレーダーRIの特長 | 特長が説明される例の場所 |
Viewと複合のUI | ||
Region: Viewを配置するための領域の使用は、レイアウトがどのように実装されるか知ることなく、実装します | 領域は、シェルと領域内で、モジュールの命令のViewを定義します。 |
StockTraderRI\Shell.xaml StockTraderRI.Modules.Position\Orders\OrdersView.xaml |
複合のView:複合Viewが、その子Viewと、どのように、情報をやりとりするかを示しています。 | 注文画面 |
StockTraderRI.Modules.Position\Orders\OrderCompositeViewModel.cs StockTraderRI.Modules.Position\Orders\OrderDetailsViewModel.cs StockTraderRI.Modules.Position\Orders\OrderCommandsView.xaml.cs |
モジュールを横断してUIを構成しています。: モジュールは、シェルの異なる部分で、互いに相互作用するViewを、どのように、持つことができます。 | Watchモジュールは、また、ツールバーの一部で、Viewを持っています。 |
StockTraderRI.Modules.Watch\AddWatch\AddWatchView.xaml StockTraderRI.Modules.Watch\WatchList\WatchListView.xaml |
Newsモジュールは、記事リストViewと同じ記事を表示するポップアップする記事リーダViewを持っています。 |
StockTraderRI.Modules.News\Article\ArticleView.xaml StockTraderRI.Modules.News\Article\NewsReader.xaml |
|
デカップリング通信 | ||
コマンド:Commandパターンを表示します。株を売り買いするコマンドは、デリゲート・コマンドです。 リスト内の各々の行は、同じコマンド・インスタンスを使用しますが、株式に対応する異なるパラメータを持っています。 これは、レシーバーから、invokerを分離し、そして、コマンドで追加のデータを渡すことを表示します。 | 売り買いコマンドは、OrdersControllerで、PositionSummaryViewとハンドラを呼び出します。 |
StockTraderRI.Modules.Position\Controllers\OrdersController.cs StockTraderRI.Modules.Position\PositionSummary\PositionSummaryView.xaml |
複数の要素で構成されたコマンド:全てのコマンドをくまなく伝えるために、複合のコマンドを使用します。 Submit AllとCancel Allコマンドは、SubmitやCancelコマンドのすべてのそれぞれのインスタンスを実行します。 | Submit All と Cancel All ボタン |
StockTraderRI.Infrastructure\StockTraderRICommands.cs StockTraderRI.Modules.Position\Orders\OrderDetailsViewModel.cs StockTraderRI.Modules.Position\Controllers\OrdersController.cs |
Event Aggregatorパターン: 分離されたモジュール全体で、イベントを公開し、購読します。 発行者と購読者は、イベント型以外の契約を持っていません。 | 関連したニュース内容を表示します。:ユーザーが、ポジション・リストでポジションを選択するとき、 ニュース・モジュールへの通信は、EventAggregatorサービスを使用しています。 |
StockTraderRI.Modules.Position\PositionSummary\PositionSummaryPresentationModel.cs StockTraderRI.Modules.News\Controllers\NewsController.cs |
市場の供給の更新:市場の供給サービスの利用者は、 新しい供給が利用できるとき、通知されるイベントを購読します。 ;利用者は、続いて、UIの背後にあるModelを更新します。 |
StockTraderRI.Modules.Market\Services\MarketFeedService.cs StockTraderRI.Modules.Position\PositionSummary\ObservablePosition.cs StockTraderRI.Modules.Watch\WatchList\WatchListViewModel.cs |
|
サービス:また、サービスは、モジュールの間で、情報をやりとりするために使用されます。 サービスは、コマンドに比べて、より契約的で、柔軟です。 | モジュールアセンブリ内のいくつかのサービス実装 |
Services: StockTraderRI.Modules.Market\Services\MarketFeedService.cs StockTraderRI.Modules.Market\Services\MarketHistoryService.cs StockTraderRI.Modules.News\Services\NewsFeedService.cs StockTraderRI.Modules.Watch\Services\WatchListService.cs StockTraderRI.Modules.Position\Services\AccountPositionService.cs StockTraderRI.Modules.Position\Services\XmlOrdersService.cs |
他の技術的な難問 | ||
WPF:ユーザー・インターフェイスのために、WPFを使用します。 | シェルとモジュールのView | 株トレーダーRIのための開始位置-デスクトップ版は、StockTraderRI\App.xaml.csです |
ブートストラッパー:アプリケーションと全体のサービスを初期化するためにブートストラッパーを使用する。 | ログの記録とモジュール・カタログの定義のような、ブートストラッパーを作成し、そして、全体のサービスを設定する。 |
Bootstrapper: StockTraderRI\StockTraderRIBootstrapper.cs |
ユニットと受け入れテスト
Unit and Acceptance Tests
株トレーダーRIには、ソリューションの範囲内で、単体テストが含まれています。 ユニット・テストは、ソース・コードのそれぞれのユニットが期待通りに動作するか確かめます。
株トレーダーRIのユニット・テストを実行します
- Testメニューで、Runを指し、そして、その次に、All Tests in Solutionをクリックします。
株トレーダーRIには、受入検査が含まれている分離したソリューションが含まれています。 受入検査では、あなたが、一連の手順に従うとき、アプリケーションが、どのように動作する必要があるかを説明します。 あなたは、さまざまな使い方をする、アプリケーションの機能の挙動を調べるために、受入検査を使用することができます。
株トレーダーRIの受入検査を実行します
- Visual Studioで、ソリューション・ファイル StockTrader RI\StockTraderRI.Tests.AcceptanceTest\StockTraderRI.Tests.AcceptanceTest.slnを開きます。
- ソリューションを構築します。
- Test Explorerを開きます。
- ソリューションを構築した後、テストは見つかるでしょう。受入検査を実行するために、Run Allボタンをクリックします。
結論
Outcome
あなたは、参考になる実装のウィンドウを確かめる必要があります。 そして、テストは、自動的に、アプリケーションと相互作用します。 テスト実行の終了時に、あなたは、すべてのテストが渡されたことを確かめる必要があります。
詳細情報
More Information
Prismに含まれる、他のコードサンプルについて学ぶためには、次のトピックを参照してください。:
- モジュール方式のクイックスタート
- インタラクティブ性のクイックスタート
- MVVMクイックスタート
- 命令のクイックスタート
- UI構成のクイックスタート
- 状態に基づいたナビゲーションのクイックスタート
- 表示を切り替えるナビゲーションのクイックスタート
- イベント集約のクイックスタート
WPFのためのPrismの参考になる実装のコードサンプル
Prism for WPF Reference Implementation Code Sample(原文)
概要
Introduction
Prismには、参考になる実装と呼ばれるサンプルが含まれています。これは、実際の使い方に基づく複合アプリケーションです。 この意図的に不完全なアプリケーションは、複合アプリケーションの基本的なアーキテクチャを説明しています。 アプリケーションの内では、あなたは、一般的な、そして、開発者が、複合アプリケーションを作成するとき、 直面する繰り返し起こる難問のためのソリューションを見るでしょう。 私たちは、Model-View-ViewModel(MVVM)、複合View、イベント・アグリゲータ、プラグインと依存関係注入のような、 デザイン・パターンを使用して、難問の多くを解決します。 分離の重要性と疎結合のような、重要な構造的な設計原理を実現しています。 Prismは、あなたが、モジュール・アプリケーション・デザインを作成するのを助けます。 そして、構築されたアプリケーションは、疎く結合したコンポーネントを使用しています。 それは、独立して進化することができます。 しかし、それは、全体的なアプリケーションに、簡単に、継ぎ目なく、統合することができます。
参考になる実装は、実際のアプリケーションではありません。; しかしながら、それは、顧客が取り組んでいる実際の難問に基づいています。 あなたが、このアプリケーションを調べるとき、株トレーダー・アプリケーションを構築することのための基準点として、それを調べません。 -その代わりに、複合アプリケーションを構築するための参照として、調べます。
サンプルの構築
Building the Sample
このクイックスタートは、Microsoft Visual Studio 2012以降と.NET Framework 4.5.1を必要とします。
MVVMのクイックスタートを構築して、実行するには、
- Visual Studioで、ソリューション・ファイルStockTrader RI\StockTraderRI_Desktop.slnを開きます。
- Buildメニューで、ソリューションのリビルドをクリックします。
- QuickStartを実行するために、F5を押してください。
詳細情報
More Information
詳細については、MSDNの関連するドキュメンテーション(原文)を参照してください。