web-dev-qa-db-ja.com

ビューモデルとデータ転送オブジェクトの違いは何ですか?

私はこの質問をファウラーPoEAAに基づいています。このテキストに精通していることを考えると、ASP.NET MVCで使用されるViewModelはDTOと同じではありませんか?なぜまたはなぜそうではないのですか?ありがとうございました。

47
mkelley33

これらは同様の目的(アプリケーションの別のレイヤーのデータをカプセル化する)を提供しますが、異なる方法で異なる理由でそれを行います。

  • DTOの目的は、特にそれらの呼び出しが高価な場合(分散システムなど)、アプリケーションの層間の呼び出しの数を減らすことです。 DTOは、ほとんどの場合、簡単にシリアル化でき、動作が含まれることはほとんどありません。

    たとえば、eコマースサイトを開発しているとします。 CreateCustomerAddCustomerAddressはデータベースレベルでの個別の操作ですが、パフォーマンス上の理由から、データをNewCustomerWithAddressDtoに集約して、クライアントが1回だけラウンドする必要がある場合があります。 -サーバーに移動します。サーバーがデータの区画でさまざまなことを実行している可能性があることを気にする必要はありません。

  • 「ViewModel」という用語は、MV *のさまざまなフレーバーでわずかに異なることを意味しますが、その目的は主に関心の分離です。モデルは、プレゼンテーション以外の目的で最適化されることがよくあります。ビューをモデルの実装の詳細から切り離すのは、ViewModelの責任です。さらに、ほとんどのMV *パターンは、ビューをできるだけ「ダム」にすることを推奨しているため、ViewModelがプレゼンテーションロジックを担当する場合があります。

    たとえば、同じeコマースアプリケーションで、CustomerModelが「新規顧客」ビューに表示するための間違った「形状」であるとします。手始めに、ビューにはユーザーがパスワードを入力して確認するための2つのフォームフィールドがあり、CustomerModelにはパスワードフィールドがまったく含まれていません。 NewCustomerViewModelにはこれらのフィールドが含まれ、MV *のフレーバーによっては、プレゼンテーションロジック(ビューの一部の表示/非表示など)と基本的な検証(両方のパスワードフィールドが一致することの確認など)を担当する場合があります。 )。

81
Iain Galloway

目的は異なります:

  • DTOはデータの転送に使用されます
  • ViewModelsは、エンドユーザーにデータを表示するために使用されます。

したがって、通常、ViewModelsにはプレゼンテーションデータが含まれています。多くの場合、witchはDTOにあるものと似ていますが、いくつかの違いがあります。列挙型、ローカリゼーション、通貨、日付形式などの表現について考えてみてください。これは、通常、ビューにロジックがないはずだからです。

16
Bavo

MVVMとMVPのDTOは通常Very Dumb Objectsであり、基本的にはプロパティセッターとゲッターの集まりにすぎません。一方、ViewModelsにはいくつかの動作があります。

DTOを使用することの実際的なプラスの副作用は、シリアル化が容易になることです。たとえばC#にかなり複雑なオブジェクトがある場合、シリアル化したくないものを選択的にオフにする必要があることに気付くことがよくあります。これはかなり醜くなる可能性があり、DTOはこのプロセスを簡素化します。

15
Igor Zevaka

ビューモデルとデータ転送オブジェクトには類似点と相違点があります。

同様:ビューまたはサービスに関係なく、レコード(オブジェクトインスタンス、おそらくシリアル化された)のデータをレシーバーに転送します

違い:ビューモデルは、ビューに送信され、そこでフォーマットされて表示されることを目的としています。ビューモデルは、データをコントローラーに送り返します。 DTOは通常、プレゼンテーションを目的としていません。生データを送信することを目的としています。

1
Brother Bill