UserControlをMVPパターンでフォームに添付するにはどうすればよいですか?
-
05-07-2019 - |
質問
MVPパターンを使用して、一種のマスター/詳細UIを作成しようとしています。通常の容疑者がいます:
interface IMainView{}
class MainView: Form, IMainView{}
interface IMainPresenter{}
class MainPresenter{}
// Numerous domain objects
また、独自のMVPトライアドのビューでもあるUserControlがあります:
interface ISubView{}
class SubView: UserControl, ISubView{}
interface ISubPresenter{}
class SubPresenter{}
MainPresenterはSubPresenterのインスタンスとインスタンスを作成し、SubPresenterはSubViewのインスタンスを作成します。私の問題は、ビューがお互いへの参照を含んでいないか、お互いが存在していることさえ知らないことです。彼らは自分のプレゼンターだけを知っていますが、UserControlであるビューをFormである別のビューに添付したいと思います。これにより、各ビューの互いの無知を維持することは可能ですか?
この時点まで、すべてのビューは各プレゼンターが必要とするプロパティをシステムタイプとして公開しているため、ListBoxがComboBoxまたはRadioGroupに変更されてもプレゼンターは影響を受けません。可能であればこの方法を維持したいのですが、他に選択肢がない場合はこのパターンを破ります。
これを行う私の理由は、MainViewがユーザーにオブジェクトのコレクションを提示することです。各オブジェクトは、いくつかの(50を超える)異なるクラスの1つです。すべてが共通のインターフェイスを実装しますが、各オブジェクトを操作するためのUIは、基になるクラスによって異なります。
ところで、これは.NET 2.0をターゲットとするWinformsアプリケーションです(ただし、C#3.0としてコンパイルされます)
解決
サブプレゼンターがそのビューへの参照をメインプレゼンターに渡すことでこれを解決し、メインプレゼンターはそれをビューに渡し、空のパネルに割り当てます。
subView
|
V
subPresenter
|
V
mainPresenter
|
V
mainView
これは単純な古いオブジェクトとして渡されるため、どちらのプレゼンターもwinforms名前空間への参照を含める必要はありません。 mainViewは、単にUserControlの子孫を想定し、そのようにキャストします。