15

他の人と同じ情報を必要とする意見があることに気づきました。ただし、ビューモデルのプロパティが5つ必要な場合もあれば、2つだけ必要な場合もあります。

そのようなビューモデルを多くのビューで共有しますか、それともビューごとに個別のビューモデルを作成しますか、それとも継承または構成戦略を好みますか?

私にとって、ビューモデルを共有することにはいくつかの欠点があります。

  1. 驚き最小の原則:データベースの追加データをクエリしたくないため、ビューモデルの5つのプロパティのうち2つだけを埋めて、null参照例外を取得するのは奇妙です。ビューモデルに5つのプロパティがある場合、すべてが満たされていると思います。例外はルールを証明します。
  2. 関心の分離/単一責任の原則:ビューごとに異なるニーズに対応する必要があるため、複雑なサイトではビューモデルが乱雑になります。ロジックが関係している場合は、さらに複雑になります。

どう思いますか?そのような状況にどのように対処しますか?

4

8 に答える 8

11

人々は、使用の観点に基づいて、ViewModel のさまざまな哲学を持つ傾向があります。ViewModels は、ビューとモデルの間の接着剤であり、人々は通常、2 つの端のどちらをより固定したいかに基づいて答えます。

  • モデル/データ オブジェクトをより厳格にしたい場合は、ViewModel をモデル/データの近くに結び付ける傾向があります。つまり、単一の ViewModel を複数のビューで使用し、ViewModel にどのプロパティを決定させるかです。データの読み込みを処理する方法に基づいて取得します (また、画像やその他の長時間読み込みプロパティなどを延期します)。
  • ビューをより厳格にしたい場合は、ViewModel をビューの近くに結び付けます。つまり、ビューごとに個別の ViewModel を用意し、ビューからビューに移動するときにモデル/データ オブジェクトに同期などを処理させます。

個人的には、ビューよりも変更される可能性が低いため、データがより厳格になる傾向があるため、最初のデータを好みます (私のプロジェクトでは、それがデータとビューの普遍的な特性だとは思いません)。変更通知は ViewModel の自然な機能であるため、ユーザーがたまたま同じ/類似したデータを表示する 2 つのビューを持っている場合、モデル オブジェクトに変更を伝える必要はありません。

于 2012-08-30T22:00:15.893 に答える
8

私が取り組んでいるプロジェクトでは、各ビューに独自の ViewModel がありますが、複数のビュー モデルによって共有/参照される CollectionViewModel もあります。

アプリケーションの複数の画面に表示する必要があるサプライヤのリストであり、リスト ボックス、グリッド ビューなど、必要なものは何でもさまざまなコントロールにバインドされていると考えてください。ViewModel を 1 つだけ持つことで、サプライヤーのリストの更新/更新ロジックが簡単になります。

TLDR: すべてのユース ケースで同じように ViewModel を使用する場合は、ビュー モデルのみを再利用します。つまり、それらはすべて同じプロパティなどを使用します。

于 2012-08-30T21:48:24.290 に答える
4

ビューごとに個別のViewModelがあります。未使用のプロパティはコードを読みにくくします(使用されていないのにそのプロパティが存在するのはなぜですか?)。複数のビューにわたる固定されたプロパティのセットに対して同じ機能がある場合、それらのプロパティを含む基本クラスを使用していることがわかります。

于 2012-08-30T21:42:29.530 に答える
3

間違いなく、View ごとに 1 つの ViewModel です。

アプリケーションが複雑になるにつれて、共有される ViewModel も大きくなる傾向があり、必要なプロパティが 1 つだけの場合に、50 個のプロパティを持つオブジェクトを View に渡すのはあまり気分が良くありません。

また、ビューに完全に固有で、他のビューでは必要のない追加のプロパティを ViewModel に追加したい場合もあります。ViewModel のプロパティに依存する CSS クラスがあるとします。View に if else ステートメントを記述する代わりに、ViewModel にプロパティを作成します。このプロパティは、ビジネス ルールに基づいて正しい css クラスを返します。このようにして、ビューを可能な限りスリムにし、専用の ViewModel を使用して、CSS クラス名をあまり気にしないビューと共有しません。

于 2012-08-30T22:16:05.717 に答える
2

私は通常、ViewModel を共有します。私が理解しているように、ビューモデルを使用する利点は、(a) 非表示にする必要があるプロパティであるというセキュリティと、(b) ビジネス層とプレゼンテーション層の間の関心の分離です。(b) ビューモデルを共有しながら、まったく同じように達成されます。

(a) に関して言えば、ある場所ではプロパティを公開することがセキュリティ リスクであり、別の場所ではそうではないという状況に陥ることはめったにありません。プロパティを非表示にする必要がある場合は、おそらくどこでも非表示にする必要があります。もちろん、YMMV ですが、これはかなり主観的な質問のように思えます。

于 2012-08-30T21:45:36.953 に答える
0

Code First で Entity Framework を使用しているため、ドメイン クラスは sql データベースにマップされるため、かなり厳格なままにする必要があります。

一部のビューは、直接マップされたエンティティを 1 つだけ使用しますが、これは素晴らしいので、同じドメイン レイヤー エンティティを使用します。そのエンティティがさらに情報を必要とする場合 (たとえば、2 つのパスワード フィールド)、構成を使用します。「継承よりも構成を優先する必要がある」ため、構成を使用できる場合は、通常は追加のプロパティであるため、構成を使用できます。

そのエンティティの 2 つのプロパティのみを使用する画面がある場合、またはセキュリティ上の理由でプロパティを非表示にしたい場合は、新しいビュー モデルを作成して、必要なデータのみを取得します。ビュー モデルを再利用しますが、他のビューで同じプロパティが必要な場合に限ります。

于 2012-08-30T21:47:57.220 に答える