質問

ドメインモデルをビューモデルとして使用するのは悪いことだと思います。私のドメインモデルにISADMINという名前のプロパティがあり、ユーザーを作成するためのCREATEコントローラーアクションがある場合、誰かが私のフォームを変更して、私の見解でそのようなテキストフィールドを公開していなくても、それをaAdmin = trueフォーム値を投稿することができます。 。モデルバインディングを使用している場合、ドメインモデルをコミットしたとき、その人は管理者になります。そのため、ソリューションは、ビューモデルで必要なプロパティのみを公開し、AutomApperのようなツールを使用して、返信ビューモデルオブジェクトのプロパティ値をドメインモデルオブジェクトのプロパティ値にマッピングするようになります。しかし、クラスのバインド属性を使用して、バインドすべきではないプロパティをモデルバインダーに指示できることを読みました。それでは、重要なものを表現し、それらをマッピングする際にオーバーヘッドを獲得する2つの別々のクラス(ドメインモデルとビューモデル)を作成する理由は何ですか?それはもっとコード組織の問題ですか?もしそうなら、私はどのように利益を得ていますか?

編集

ドメインモデルとは別のビューモデルで出会った最も重要な理由の1つは、複雑なUIを管理するためのMVVMパターン(Martin FowlerのPMパターンに基づく)を実装する必要性です。

役に立ちましたか?

解決

私のドメインモデルは、私が望むフィールドを持つ方法の85%を得ることができますが、自分の見解で必要な値の100%をカバーしたことがないことがわかりました。特に、許可に関しては、ユーザーがビューの特定の部分にアクセスできるかどうか。

私が従おうとしているデザインコンセプトは、私の見解にできるだけ少ない論理を持つことです。これは、「Canviewthisfield」や「Caneditthisfield」などのビューモデルにフィールドを持っていることを意味します。私が最初にMVCを始めたとき、私は自分のドメインモデルを自分のビューモデルにし、私のビューを乱雑にするためにさらに1つまたは2つのフィールドだけが必要なシナリオに常に遭遇していました。私はそれを行った モデル/モデルビルダーを表示します ルートとそれは私にとって素晴らしく機能しました。私はもうコードと戦うことはありませんが、ドメインモデルに影響を与えることなく、必要なビューモデルを強化することができます。

他のヒント

ViewModelを持っているもう1つの正当な理由は、大規模なデータセットのページングです。ビューに人の配列を渡すことができます( Person[] )しかし、ページ数、現在のページの数、ページのサイズなどのメタデータは、 Person クラス。

したがって、PersonListViewModelはこの問題を解決します。

ViewModelは、ビューで必要とされるメンバーのみを保持します。彼らは通常、基礎となるドメインモデルの単純化または「平坦化」と考えることができます。

このように考えてみてください:

  • ViewModel: :これは、このビューでレンダリングするのに適したデータです
  • ドメインモデル: :これは、すべての機能を実行するために私のアプリケーションがこのエンティティに関する必要とするすべての情報です

たとえば、私の注文クラスには顧客と呼ばれるメンバーがいます。 構成 協会、つまり私の注文 があります お客様。この顧客オブジェクトには、FirstName、LastNameなどのメンバーがいます...しかし、注文または注文リストの「詳細」ビューとそれらを配置した顧客にこれをどのように表示しますか?

さて、ViewModelを使用して、カスタム名メンバーを備えたOrderListItemViewModelを持つことができ、firstNameとLastNameの組み合わせを顧客オブジェクトからこれにマッピングできます。これは手動で行うことができます。 AutomApper または類似。

このアプローチを使用すると、さまざまなビューに固有の複数の注文ビューモデルを使用できます。たとえば、注文リストビューは、顧客名を注文の詳細ビューとは異なる方法でレンダリングする可能性があります。

ViewModelsのもう1つの利点は、ビュー上の基礎となるドメインオブジェクトに不要なデータを削減できることです。等...?私はそれがリストの目的に依存すると思いますが、おそらくそうではありません。

特定の方法でデータを表示する必要がある場合(つまり、MM/DD/YYYY対Yyyy/MM/DDの形式で日付を表示します)、多くの場合、ドメインではなく、このプロパティをビューで作成する方が簡単です。モデル、DBの列へのマッピングがあります(またはすべき)。

あなたはあなたのことを覚えておく必要があります domain model classes 使用されるだけです internally;つまり、彼らはクライアントに送られることはありません。これが、サービスモデルタイプ(表示モデルタイプ)が使用されるものです。クライアントとサービスの間を行き来するデータを表しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top