DTO = ViewModel?


102

NHibernateを使用してドメインオブジェクトを永続化しています。物事をシンプルに保つために、ASP.NET MVCプロジェクトをプレゼンテーションレイヤーとサービスレイヤーの両方として使用しています。

コントローラークラスからドメインオブジェクトをXMLで返したいのですが。Stack Overflowのいくつかの投稿を読んだ後、DTOを収集します。ただし、ViewModelについての投稿もありました。

私の質問:データ転送オブジェクトとViewModelは同じものですか?それともViewModelはDTOのサブパターンの一種ですか?


9
ほとんどの回答がMVVMについて言及しており、ASP.NET MVCを使用しているため、ASP.NET MVCのViewModelsはWPF(MVVM)のViewModelsと100%同等ではないことを言及することは適切だと思います。
Matthijs Wessels

回答:


104

DTOの標準的な定義は、動作のないオブジェクトのデータ形式です。

ViewModelsはビューのモデルです。ViewModelは通常、1つ以上のオブジェクト(またはDTO)からの完全または部分的なデータと、ビューの動作に固有の追加のメンバー(ビューによって実行できるメソッド、ビュー要素を切り替える方法を示すプロパティなど)です。ビューとビヘイビアーのすべてのデータとしてビューモデルを見ることができます。ViewModelは、1対1でビジネスオブジェクトまたはDTOにマップする場合としない場合があります。

ちなみに、NHibernate プロジェクションは、特定のビューモデルが永続化オブジェクトからのデータのサブセットを必要とする場合に便利です。


これを説明できますか:「DTOは何の動作もないオブジェクトのデータ形式です」?
roozbeh S

2
意味... DTOクラスは通常、プロパティのみが含まれており、ビジネスロジックを持つ任意のメソッドが含まれていないなど...
ダニエルオージェ

71

ASP.NET MVCのViewModelはDTOと同じですが、MVVMのViewModelには動作がありますが、DTOにはないため、MVVMパターンのViewModelはDTOとは異なります。


4
これは良い答えです。詳細については不十分ですが。
Phil

5
asp.net mvcのViewModelがDTOと同じである必要があるのはなぜですか?それは意味がありません。ViewModelは、DTOではない動作を持つことができます。これはmvcに依存しません。
エリザベス

8
ASP.NET MVC ViewModelとMVVM ViewModelを区別するための+1。
ロナルド

5
@Elisa-かなり古い質問への答えは、ASP.NET MVCでは、ビューがモデルとビューをステートレスな方法で変更するために、ViewModelではなくコントローラーのアクションを呼び出すということです。このため、ビューに合わせたDTOは、基本的にViewModelと同じです。ただし、別のシリアル化境界を持つ大規模なシステムでは、DTOは、ビュー用に特別に形成されたViewModelから分離されている場合に有益です。
dansan 2014年

27

DTO!= ViewModel

MVVMのパターンのViewModelはビューからモデルを分離するために使用されます。モデルを表すには、NHibernateなどを介してデータベースに再度マッピングされる単純なDTOクラスを使用できます。しかし、DTOとしてモデル化されたViewModelクラスを見たことがありません。ViewModelクラスには、DTOにはない動作がほとんどあります。


2
それで、DTOは単なる構造体になることができますか(または、構造体の機能を模倣する必要があるクラスですか)?
Max Alexander

20

DTO-データ転送オブジェクトは、データを転送するためのコンテナーです。それらには振る舞いはありませんが、セッターとゲッターの束だけです。一部の人々はそれらを不変にし、既存のものを更新するのではなく、必要に応じて新しいものを作成します。それらは、回線を介した転送を可能にするためにシリアライズ可能でなければなりません。

リモートサービスへの呼び出しは高額になる可能性があるため、必要なすべてのデータがDTOにプッシュされ、1つのチャンク(粗い粒子)でクライアントに転送されるため、通常、DTOはプロセス境界を越えて1つのレイヤーから別のレイヤーにデータを送信するために使用されます。

ただし、画面にバインドされたDTOの概念を使用する人もいます(プロセス境界を越えることとは関係ありません)。繰り返しになりますが、これらには必要なデータ(通常、特定の画面に必要なデータであり、さまざまなソースからのデータの集約である可能性があります)が入力され、クライアントに送信されます。

http://blog.jpboodhoo.com/CommentView,guid,21fe23e7-e42c-48d8-8871-86e65bcc9a50.aspx

既に述べたように単純なケースでは、このDTOはビューへのバインドに使用できますが、より複雑なケースでは、ViewModelの作成とDTOからViewModelへのデータのアンロードが必要になるため、明らかに作業量が多くなります(MVVMパターンを適用する場合)。 。

したがって、すでに述べたように、DTO!= ViewModel

そして

DTOとViewModelの人生の目的は異なります


13

まず、大きな違いは、ViewModelがDTOがしてはならない動作またはメソッドを持つことができるということです!!!

2つ目は、ASP.NET MVCでViewModelとしてDTOを使用すると、アプリケーションがDTOと緊密に結合されます。これは、DTOを使用する目的とは正反対です。そうする場合、ドメインモデルまたはDTOを使用した場合の違いは何ですか?

また、ASP.NETのViewModelは検証にDataAnnotationsを使用できます。

同じDTOは異なるViewModelsマッピングを持つことができ、1つのViewModelは異なるDTOから構成できます(常にオブジェクトマッピングでは構成ではありません)。DTOを含むViewModelがあるとさらに悪いと思うので、同じ問題が発生します。

プレゼンテーションレイヤーから、DTOをコントラクトとして考えます。アプリケーションに対して他人と見なす必要があるオブジェクトを受け取り、それを制御することはできません(exサービス、dtoレイヤー、プレゼンテーションレイヤーがある場合でも)あなたのものです)。

最後に、このクリーンな分離を行うと、開発者は簡単に共同作業できます。ViewModel、ビュー、コントローラーを設計する人は、他の開発者が実装を完了したときにマッピングを行うため、サービスレイヤーやDTO実装について心配する必要はありません。テスト用のデータを含むプレゼンテーション層。


1
VS 2012をインストールしてMVC 4シングルページアプリケーションを確認しました。サンプルプロジェクトでは、DTOはWebApiのコントローラーメソッド(またはアクション)のパラメーターとして使用されます。つまり、JSONはこれらのメソッドにポストされ、MVCマジックを使用して、データはメソッドに渡される前に自動的にDTOに変換されます。この場合、DTOを使用するのは間違っていると思いますか。ViewModelはWeb APIで使用する必要がありますか?私はこれらの概念にまだそれほど詳しくないので、私はよりよく理解することを求めています。
ジャン=フランソワ・ビーチャム

SalutJean-FrançoisBeauchamp :) ASP.NET MVCは、URLプラムをオブジェクトに解析できます。たとえば、次のようにする代わりに、Indexメソッドajax / index / {jobID} / {ResultsToSkip} / {ResultsToSend}へのマッピングがあるとします。コントロールのIndex(int jobID、int ResultsToSkip、int ResultsToSend)にIndex(request)があります(requestは3つのフィールドjobIDをカプセル化するオブジェクトです...)したがって、今ではparamsの代わりにDATA、そうです、requestDTOと言うことができます。たとえば、APIインターフェースメソッドではなく、DTOのみを変更する1つのフィールドを追加する必要があります
riadh gomri

9

いくつかの単純なビューでは、モデルとしてDTOを使用しますが、ビューがより複雑になるにつれて、ViewModelを作成します。

私にとっては、それは迅速性(DTOを使用しているので、既に持っているので)と柔軟性(ViewModelを作成することで、関心事をより分離すること)のバランスです。


2
素晴らしい実用的な答え。
Simon Tewsi、2016

0

DTOをViewModelとして使用する場合は、何らかの理由でDTOを変更しているためにDTOへの依存度が高くなり、ViewModelに影響を与える可能性があります。

DTOを使用してビューモデルに変換することをお勧めします。


-1

DTOが使えるModelクラスと同じで、単一のビューで複数のモデルデータ/プロパティを表示/使用する必要がある場合は、viewmodelを使用できます。例:最初にエンティティフレームワークデータベースを使用してモデルを作成します。したがって、すべてのモデルはデータベースに基づいて生成されます。次に、データアノテーションが必要です。これらのデータアノテーションには、フォルダー名DTOを作成できます。このDTOフォルダーでは、すべてのモデルを正確に保ち、​​データアノテーションをプロパティの上に追加して追加できます。次に、このDTOクラスを使用して、任意の操作(コントローラ、ビューを使用)を使用できます。複雑なビューが必要な場合、つまり1つのビューに複数のクラスデータが必要な場合は、viewmodelを使用できます。viewmodelの場合は、viewmodelというフォルダー名を作成し、カスタムクラスを作成して、必要なプロパティを保持できます。私は自分を片付けようとしました。どんな提案も高く評価されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.