2012-01-31 11 views
4

私は、WinControl(.NET 4)アプリケーションをリファクタリングして、TabControlを使用してUserControlを含むようにします.UserControlは各TabPageでインスタンス化され、各タブの編集者これらは、フォーム全体によって編集されているオブジェクトに最終的にフィードされるアイテムのコレクションを編集しています。WinFormsとUserControlsのコレクションを持つHumble View/MVP

  • class School
    • string Name
    • string Address
    • Course S、いくつかの適切なフィールドを持つそれぞれ(DepartmentName、等)の収集
    :例えば、クラス構造として

(これは実際には学校関連のアプリケーションではないですが、メタファーは動作します。)

視覚的に、ユーザーコントロールのセット親フォームSchool情報を扱う一方で、Course ESを管理します。

今、私はフォーム/スクールの発表者と、UserControl/Courseのプレゼンターを持っていて、それぞれを見ています。学校の発表者はコースのいくつかの情報を管理する必要があります。たとえば、1つのコースで選択されたオプションは、他のコースのオプションを制限します。 Schoolモデルでは、その計算が処理されますが、コースのプレゼンターに連絡する必要があります。

私はMVPの議論でこのタイプの関係の例を見つけるのにあまり成功していません。これは初めてのMVPアプローチです。これを処理するための良い選択肢は何ですか?学校の発表者がコースのプレゼンターのコレクションを持ってそのセットを表現することは適切ですか?スクールの見解にはコースの見解の集まりがありますか?

私の主な目標は、テスト容易性と保守性を向上させることです(これまでのところ、主要な情報源はMichael Feathersの「The Humble Dialog Box "とJeremy Millerの" Build You Own CAB "シリーズがあります。

答えて

2

私が同様の状況をどのように処理するかは、親プレゼンターが子プレゼンターについて(コンストラクターの依存関係として)知っている必要があることです。初期化する親 - - これが以外のすべての必要なデータをフェッチするためである(それぞれの子のプレゼンターに初期化呼び出し

初期化() :私のロジックのようなものになり、親プレゼンターにおけるよう

は、それぞれの子のプレゼンターは、そのビューを持っていますたとえば、請求書プレゼンターがある場合は、コンボボックスを持っていればどこからでも顧客のコレクションを取り込んで、請求書のためにこれを変更することができます) - 子ビューを親ビューに埋め込みます親は通常、子供がユーザーコントロールであるフォーム)

その後通常、親をロードするときに、いくつかのLoadXXXメソッドを使用して、子もロードします。あなたの例では、

schoolPresenterのようなものになります。LoadSchool順番にすべてのプレゼンターにデータをロードします(学校)

は、学校の詳細と例の負荷親コントロールのために、プレゼンターコースなどにコースのコレクションを渡す...

一つは、私はそれに気づいたと思いますこれらのプレゼンターのそれぞれにRefresh()メソッドを持たせることです。これらのプレゼンターは、現在のステータスに基づいて自身をロードする方法を基本的に知っています。たぶんあなたは親のプレゼンターでこのようなメソッドを持つことはできませんが、シンプルなプレゼンターはこれと同じようにうまくいくので、LoadSchoolメソッドでは

coursesPresenter.Courses = school.Courses; coursesPresenter.Refresh();

+1

私は信じられないほど遅い応答のために謝罪します。これは非常にうまくいっていて、非常にテスト可能でした。ありがとうございました! –

関連する問題