web-dev-qa-db-ja.com

データ転送オブジェクトとは何ですか?

データ転送オブジェクトとは何ですか?

MVCにはモデルクラスDTOがありますが、そうでない場合はどのような違いがあり、両方が必要ですか?

180
Yaron Naveh

データ転送オブジェクトは、データをカプセル化し、アプリケーションのあるサブシステムから別のサブシステムに送信するために使用されるオブジェクトです。

DTOは、N層アプリケーションのサービス層で最も一般的に使用され、それ自体とUI層の間でデータを転送します。ここでの主な利点は、分散アプリケーションでワイヤを介して送信する必要があるデータの量を減らすことです。また、MVCパターンで優れたモデルを作成します。

DTOのもう1つの用途は、メソッド呼び出しのパラメーターをカプセル化することです。これは、メソッドが4つまたは5つ以上のパラメーターを取る場合に役立ちます。

DTOパターンを使用する場合、DTOアセンブラも使用します。アセンブラは、ドメインオブジェクトからDTOを作成するために使用され、その逆も同様です。

ドメインオブジェクトからDTOへの変換およびその逆の変換は、コストのかかるプロセスになる場合があります。分散アプリケーションを作成していない場合、おそらくこのパターンから大きなメリットは得られないでしょう Martin Fowlerがここで説明します

184
Benny Hallett

DTOの定義は Martin Fowlerのサイト にあります。 DTOは、パラメーターをメソッドに転送するため、および戻り値の型として使用されます。多くの人々はそれらをUIで使用しますが、他の人はそれらからドメインオブジェクトを膨張させます。

24
blu

DTOは愚かなオブジェクトです-プロパティを保持し、ゲッターとセッターのみを持ちますが、重要な他のロジックはありません(compare()またはequals()実装以外の場合)。

通常、MVCのモデルクラス(ここでは.net MVCと仮定)は、DTO、またはDTOのコレクション/集合体です。

19
Eric Petroelje

一般的には、値オブジェクトは不変でなければなりません。 JavaのIntegerまたはStringオブジェクトと同様です。これらを使用して、ソフトウェアレイヤー間でデータを転送できます。マイクロサービス環境やレガシーJava Enterprise Appなどの異なるリモートノードで実行されているソフトウェアレイヤーまたはサービス。 2つのクラスのほぼ正確なコピーを作成する必要があります。これが私たちがDTOに出会った場所です。

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|

従来のJava Enterprise Systems DTOには、さまざまなEJBを含めることができます。

これがベストプラクティスであるかどうかはわかりませんが、Spring MVC/Bootプロジェクトでは、個人的にValue Objectsを使用しています。

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|

コントローラーレイヤーはエンティティが何であるかを知りません。 フォームおよび値オブジェクトの表示と通信します。フォームオブジェクトにはJSR 303検証アノテーション(@NotNullなど)があり、値オブジェクトの表示カスタムシリアル化用のJacksonアノテーションがあります。 (たとえば、@ JsonIgnore)

サービス層は、エンティティオブジェクトを使用してリポジトリ層と通信します。エンティティオブジェクトには、JPA/Hibernate/Spring Data注釈があります。すべての層は、下位層のみと通信します。循環/循環依存のため、層間通信は禁止されています。

User Service ----> XX CANNOT CALL XX ----> Order Service

一部のORMフレームワークには、追加のインターフェイスまたはクラスを使用した投影機能があります。そのため、リポジトリはViewオブジェクトを直接返すことができます。そこで、追加の変換は必要ありません。

たとえば、これはユーザーエンティティです。

@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、firstname、lastnameのみを含むユーザーのページ区切りリストを返す必要があります。次に、ORMプロジェクションのビュー値オブジェクトを作成できます。

public final class UserListItemView {
    private String id;
    private String firstname;
    private String lastname;
    // Accessors ...
}

リポジトリレイヤーからページ分割された結果を簡単に取得できます。春のおかげで、投影用のインターフェイスだけを使用することもできます。

List<UserListItemView> find(Pageable pageable);

他の変換操作を心配しないでくださいBeanUtils.copyメソッドは問題なく動作します。

10
Fırat KÜÇÜK
  1. 私にとっての質問に対する最良の答えはDTOとは、DTOがテストを必要とするビジネスロジックやメソッドの実装を含めないシンプルなオブジェクト。
  2. 通常、モデル(MVCパターンを使用)はインテリジェントモデルであり、そのモデル(ビジネスロジックではなく、コントローラーにある必要があります)に対して異なる操作を行う多くのメソッドを含めることができます。ただし、データを転送する(たとえば、REST(GET/POST/whatever)エンドポイントをどこから呼び出すか、SOAを使用してWebサービスを使用するなど)エンドポイントに不要なコードを使用して大きなサイズのオブジェクトを送信したり、データを消費したり、転送を遅くしたりしないでください。
8
Thiago Burgos

MVCデータ転送では、オブジェクトを使用してドメインモデルをよりシンプルなオブジェクトにマッピングし、最終的にビューに表示されることがよくあります。

から ウィキペディア

以前は値オブジェクトまたはVOと呼ばれていたデータ転送オブジェクト(DTO)は、ソフトウェアアプリケーションサブシステム間でデータを転送するために使用される設計パターンです。 DTOは、多くの場合、データベースからデータを取得するためにデータアクセスオブジェクトと組み合わせて使用​​されます。

5
Dan