データ転送オブジェクトとは何ですか?
質問
データ転送オブジェクトとは何ですか?
MVC にはモデル クラス DTO があります。そうでない場合、違いは何ですか。両方が必要ですか?
解決
データ転送オブジェクトは、データをカプセル化し、別のアプリケーションの1つのサブシステムからそれを送信するために使用されるオブジェクトである。
のDTOは、最も一般的にそれ自体とUI層との間でデータを転送するN層アプリケーションにサービス層で使用されます。ここでの主な利点は、分散アプリケーションでは、ワイヤを介して送信する必要のあるデータの量を減少させることです。彼らはまた、MVCパターンに大きなモデルを作る。
のDTOの別の用途は、メソッド呼び出しのパラメータをカプセル化することができます。この方法は、4つの以上または5つのパラメータをとる場合に有用であることができる。
DTOパターンを使用する場合は、、あなたはまた、DTOのアセンブラを使用することでしょう。アセンブラは、ドメイン・オブジェクトからのDTO、およびその逆を作成するために使用されます。
ドメインオブジェクトからDTOへと再び変換は、高価なプロセスであることができます。あなたは、分散アプリケーションを作成していない場合は、おそらくマーティンとして、パターンから任意の大きな利点は表示されませんファウラーはここを説明します。
他のヒント
DTOの定義は、 Martin Fowler氏のサイトの上で見つけることができます。 DTOは、メソッドにし、戻り値の型としてパラメータを転送するために使用されています。多くの人々は、UIのものを使用しますが、他の人がそれらからドメインオブジェクトを膨らまます。
DTOはダムの目的である - それはちょうど特性を保持し、ゲッターとセッターが、任意の有意性のない他の論理(多分比較以外の()または等号()インプリメンテーション)を有する
。 MVCにおける一般的モデルクラスはのDTOをしている(ここで.NET MVCと仮定して)、またはコレクション/のDTOの凝集体
一般的に 値オブジェクト 不変である必要があります。のように 整数 または 弦 Java のオブジェクト。これらは、ソフトウェア層間でデータを転送するために使用できます。ソフトウェア層またはサービスが、マイクロサービス環境や従来の Java Enterprise App などの異なるリモート ノードで実行されている場合。2 つのクラスのほぼ正確なコピーを作成する必要があります。ここが私たちが DTO と出会った場所です。
|-----------| |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------| |--------------|
従来の Java Enterprise Systems では、DTO にさまざまな EJB 要素を含めることができます。
これがベストプラクティスかどうかはわかりませんが、私は個人的に使用しています 値オブジェクト 私のSpring MVC/Bootプロジェクトでは次のようになります:
|------------| |------------------| |------------|
-> Form | | -> Form | | -> Entity | |
| Controller | | Service / Facade | | Repository |
<- View | | <- View | | <- Entity / Projection View | |
|------------| |------------------| |------------|
コントローラ レイヤーはエンティティが何であるかを知りません。それは通信します 形状 そして 値オブジェクトの表示. 。フォーム オブジェクトには JSR 303 検証アノテーション (@NotNull など) があり、 値オブジェクトの表示 カスタムシリアル化用の Jackson 注釈があります。(例: @JsonIgnore)
サービス層はエンティティ オブジェクトを使用してリポジトリ層と通信します。Entity オブジェクトには JPA/Hibernate/Spring Data アノテーションが付けられています。すべての層は下位層とのみ通信します。循環依存性があるため、層間通信は禁止されています。
User Service ----> XX CANNOT CALL XX ----> Order Service
いくつかの ORM フレームワークには、追加のインターフェイスまたはクラスを使用して投影する機能があります。したがって、リポジトリは View オブジェクトを直接返すことができます。追加の変換は必要ありません。
たとえば、これは User エンティティです。
@Entity
public final class User {
private String id;
private String firstname;
private String lastname;
private String phone;
private String fax;
private String address;
// Accessors ...
}
ただし、ID、名、姓のみを含むユーザーのページ分割されたリストを返す必要があります。次に、ORM プロジェクション用のビュー値オブジェクトを作成できます。
public final class UserListItemView {
private String id;
private String firstname;
private String lastname;
// Accessors ...
}
リポジトリ層からページ分割された結果を簡単に取得できます。Spring のおかげで、投影にインターフェイスだけを使用することもできます。
List<UserListItemView> find(Pageable pageable);
他の変換操作については心配する必要はありません BeanUtils.copy
メソッドは正常に機能します。
- 私にとって質問に対する最良の答えは DTOとは何ですか それは? DTO は単純なオブジェクトであり、テストを必要とするビジネス ロジックやメソッドの実装を含めるべきではありません。.
- 通常、モデル (MVC パターンを使用) はインテリジェントなモデルであり、特にそのモデルに対していくつかの異なる操作を実行する多数のメソッド (ビジネス ロジックではなく、これはコントローラーにある必要があります) を含むことができます。ただし、データを転送する場合 (例:REST の呼び出し (
GET
/POST
/何でも) どこかからのエンドポイント、または SOA を使用して Web サービスを利用するなど...) エンドポイントに必要のないコードを含む大きなサイズのオブジェクトを送信したくない場合は、データを消費し、転送が遅くなります。
MVCデータ転送オブジェクトでは、多くの場合、最終的にビューで表示されますシンプルなオブジェクトにドメインモデルをマッピングするために使用されます。
からウィキペディアするます:
以前値オブジェクトまたはVOとして知らデータ転送オブジェクト(DTO)、あります ソフトウェア・アプリケーションとの間でデータを転送するために使用されるデザインパターン サブシステム。 DTOは、多くの場合、データ・アクセスに関連して使用されています オブジェクトは、データベースからデータを取得します。