0

Martin Fowler によるプレゼンテーション モデル ノートおよびプレゼンテーション モデルに関する MSDN ドキュメントによると、プレゼンテーション モデル クラスは UI クラスを認識しないようにする必要があり、同様にビジネス モデル クラスはプレゼンテーション モデル クラスを認識しないようにする必要があると説明されています。

UI はプレゼンテーション モデルに広範囲にデータバインドする必要があります。プレゼンテーション モデルは、1 つまたは複数のドメイン/ビジネス モデル オブジェクトと調整してジョブを完了します。プレゼンテーション モデルは基本的に、UI で最大限のデータ バインディングを容易にする方法でドメイン モデル データを提示します。これにより、UI が行う決定を可能な限り減らし、プレゼンテーション動作のテスト容易性を高めます。これにより、プレゼンテーション モデル クラスもジェネリックになります。つまり、特定の UI テクノロジに依存しません。

ここで、リスト フォーム (CustomerList など) と別のルート フォーム (Customer など) があり、ボタン クリックで CustomerList フォームから Customer を編集できるようにするユース ケースがあるとします。

説明を簡単にするために、カスタマー リストがメニューから開かれたとき (つまり、カスタマー メニューがクリックされたとき) にいくつかのアクションが発生し、メニュー クリック イベントからカスタマー リストが表示されたとします。

上記のユース ケースに従って、Customer List から Customer Root UI (単一の顧客) を開く必要があります。それ、どうやったら出来るの?

  1. Editボタンのクリックイベントで必要なオブジェクト(BusinessModel、PresentationModel、UI)をビルドし、そこからCustomerEdit UIを呼び出しますか?

  2. プレゼンテーション モデル クラスから CustomerEdit UI を構築し、プレゼンテーション モデルから UI を表示しますか? これは、以下の 2 つの方法のいずれかで実行できます。次の順序でオブジェクトを作成します DomainModel->PresentationModel-UIForm b. Unity.Resolve(); を使用します。いずれにせよ、P モデルは CustomerEdit が配置されている具体的な UI アセンブリを参照する必要があるため、Presentation Model に違反しています。また、P モデルは WinForm を直接参照して使用する必要があり、UI テクノロジに依存しなくなります。

違反は理論上のものであり、無視することができますが、私が間違った方向に進んでいるかどうかについてコミュニティの意見を求めます. リスト(親)フォームから子フォームを呼び出すより良い方法があるかどうかを提案してください。

  • ラジャーシ
4

2 に答える 2

0

あなたの目的は通常、保守性を容易にするために、システムのさまざまな部分の間の緩い結合です。これは、たとえば、モデルが通信する正確なタイプを認識してはならないことを意味します。必要なインターフェースについてのみ知っている必要があります。

モデルが特定のタイプではなくインターフェースで動作する限り、モデルがUIまたはビジネスロジックレイヤーで何かを参照する場合、悪いことや奇妙なことは何もありません。

于 2010-04-25T21:31:11.393 に答える
0

IEditCustomerService を CustomerList の PresentationModel に挿入するとどうなるでしょうか。これは、選択した Customer を編集する必要がある場合に呼び出されます。次に、このサービスは「必要なオブジェクトを構築」するか、このタスクを IViewManagerService に委譲します。IViewManagerService は、エンティティの編集に使用できる UI、特定の UI に使用する必要がある UI、ハット UI コンポーネントの構築方法を認識します。 . もちろん、IViewManagerService を直接 PresentationModel に挿入することで 1 つの間接化を回避することも、DI コンテナーを使用して解決することもできます。

もう 1 つの可能性は、CustomerList の PresentationModel によって起動された EditCustomerEvents を IViewManagerService 実装にリッスンさせることです。

于 2011-07-02T10:17:57.140 に答える