web-dev-qa-db-ja.com

DTOを対応するエンティティにマッピングするのが適切な場合

私が読んで実装したものから、DTOはデータモデルからの値のサブセットを保持するオブジェクトであり、ほとんどの場合、これらは不変オブジェクトです。

新しい値または変更をデータベースに戻す必要がある場合はどうなりますか?

プレゼンテーションレイヤーでDALのデータモデル/実際のエンティティを直接操作する必要がありますか?

または、プレゼンテーション層からビジネス層に渡すことができるDTOを作成し、それをエンティティに変換してから、ORM呼び出しを介してDBで更新する必要があります。これはコードが多すぎますか?これは、プレゼンテーション層にデータモデルの概念がない場合に必要になると思います。このアプローチを使用する場合、変更をコミットする前にBLLレイヤーでオブジェクトを再度フェッチする必要がありますか?

8
aggietech

DDDエンティティのようなエンティティがある場合(エンティティフレームワークなどのフレームワークでエンティティと呼ばれるものではない)、エンティティはその不変条件を保護する必要があります。したがって、エンティティをDTOとして使用することはおそらく誤りです。 DTOはユーザーからの未検証の入力データであり、そのように扱う必要があります。エンティティは、有効な不変条件のいずれかのオブジェクトタイプの検証済みデータです。したがって、DTOとエンティティの間で、検証済みのDTOをドメインエンティティオブジェクトに変換する変換が必要です。

多くの場合、人々は貧血ドメインモデル( http://www.martinfowler.com/bliki/AnemicDomainModel.html )を使用して、これらを試してみます。外部コード内の不変保護ロジックなど(したがって、あらゆる場所で不変条件をチェックする必要があります)。これは機能しますが、私見ではバグにつながります。しかし、それはほぼどこでも発生することです。特に、多くのフレームワークは、この方法でコードを非常に簡単に作成できるようにすることでこれを促進しています。これは、コーディングの最も簡単な/最速の方法につながり、最良の結果をもたらすものではないため、これは非常に悪いことです(DDDに従っている場合)...

しかし、多くの場合、DDDはやり過ぎである可能性があることを認識することも重要です。基本的にCRUDアプリケーションを作成している場合(多くの場合はそうである可能性があります)、DDDがドメインにとって過剰になる可能性があります。もちろん、これはすべての優れたアイデアを捨てて、完全な「何でもできるモード」に入る必要があるという意味ではありませんが、場合によっては、DDDの特定の部分を気にしないことが正しい選択になることがあります。もちろん、ここでの難しいトリックは、ドメインがDDDを正当化できるほど複雑であるかどうか、または特定の部分を前述のようにしてお尻に噛みつかないほど簡単であるかどうかを識別することです。 :)

6
wasatz

プレゼンテーションレイヤーが常にco-locatedとデータアクセスレイヤー(DAL)の場合、これはサーバー主導 Webアプリ(またはスタンドアロンGUI)の場合によくあることですが、通常、DTOレイヤーは必要ありません。エンティティを直接使用するだけです。

プレゼンテーションレイヤーをリモートにできる場合は、DTOをお勧めします。そして、はい、DTOはインバウンドとアウトバウンドの両方で使用できます。つまり、DTOを送信し、DTOを入力として受信して、DALを通じて永続モデルを更新します。

ただし、最近のフレームワークでは、明示的なDTOはほとんど使用されていません。優れたサーバーMVCフレームワーク(例:Spring-MVC/web for Java)を使用すると、(DALからの)エンティティクラスをトップレベルのAPI(例:RESTインターフェース)で直接操作し、マーシャリング/アンマーシャリングを実行できます。/JSONまたはXMLから透過的に。アプリケーションについて十分な詳細を提供していないため、マイレージが異なる場合があります。言語固有のRPCメカニズム(Java RMIなど)を使用している場合でも、DTOレイヤーを使用してエンティティモデルを外界から隠したい場合があります。

1
Cornel Masson