5

TabControl を使用して UserControl を格納する WinForms (.NET 4) アプリケーションをリファクタリングしています。UserControl は各 TabPage でインスタンス化され、最終結果は各タブのエディターになります。これらは、フォーム全体で編集されているオブジェクトに最終的にフィードされるアイテムのコレクションを編集しています。

クラス構造の例として:

  • class School
    • string Name
    • string Address
    • Courseそれぞれにいくつかの適切なフィールド ( DepartmentNameなど)がある のコレクション

(実際には学校関連のアプリケーションではありませんが、メタファーは機能します。)

視覚的には、UserControls のセットがCoursees を管理し、親 Form がSchool情報を処理します。

現在、Form/School のプレゼンターと UserControl/Course のプレゼンターがあり、それぞれにビューがあります。ただし、学校のプレゼンターは、コースの一部の情報を制御する必要があります。たとえば、あるコースで選択されたオプションは、他のコースのオプションを制限します。モデルはそのSchool計算を処理していますが、コースのプレゼンターに到達する必要があります。

MVP の議論でこの種の関係の例を見つけることにあまり成功していません。MVP のアプローチを取るのはこれが初めてです。これを処理するための適切なオプションは何ですか? 学校のプレゼンターがコースのプレゼンターのコレクションを持ってセットを表すことは適切ですか? 学校のビューは、コースのビューのコレクションを保持する必要がありますか? (最終的な UserControls は、最終的に何らかの方法でフォームに接続する必要がありますよね?)

私の主な目標は (当然のことながら) テスト容易性と保守容易性を高めることであり、これまでのプロセスの主な情報源は、Michael Feathers の「The Humble Dialog Box」と Jeremy Miller の「Build You Own CAB」シリーズです。

4

1 に答える 1

3

私が同様の状況に対処する方法は、親プレゼンターが子プレゼンターについて (コンストラクターの依存関係として) 知っている必要があるということです。

各子プレゼンターには独自のビューがあるため、親プレゼンターでは私のロジックは次のようになります。

Initialize() - 親の初期化 - 各子プレゼンターで initialize を呼び出します (これは、主に表示されるデータを除いて、必要なすべてのデータを取得するためのものです。たとえば、請求書プレゼンターがある場合は、顧客のコレクションをどこかから取得する必要があります。請求書でこれを変更できるように、顧客のコンボボックスを用意します) - 子ビューを親ビューに埋め込みます (通常、親はフォームであり、子はユーザー コントロールです)

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

schoolPresenter.LoadSchool(学校)

次に、すべてのプレゼンターにデータをロードします。たとえば、学校の詳細を含む親コントロールをロードし、コース コレクションをコース プレゼンターに渡します。

良いことに気付いたのは、これらのプレゼンターのそれぞれに Refresh() メソッドを用意することです。これは基本的に、現在のステータスに基づいて自分自身をロードする方法を知っています。親プレゼンターでこのようなメソッドを持つことはできないかもしれませんが、単純なプレゼンターはこのようにうまく動作するため、LoadSchool メソッドでは次のようなものを持つことができます。

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

于 2012-02-09T07:31:40.693 に答える