web-dev-qa-db-ja.com

DDD-どのレイヤーのDTOを実装する必要があるか

私の質問が初心者であれば、DDDについて謝罪しています。多くのプロパティはエンティティ/値オブジェクトの一部ではないため、ユーザーにデータを表示するには、ローカルデータ転送オブジェクトを使用する必要があると思います。

ただし、このDTOをどこに実装する必要があるのか​​、ドメインレイヤーまたはアプリケーションサービスレイヤーではわかりません。 DTOの実装はドメインの一部のようですが、サービスレイヤーでDTOのコレクションを作成してプレゼンテーションレイヤーに渡すときに、プレゼンテーションレイヤーでドメインレイヤーを参照する必要があることを意味しますが、これは誤りのようです。

DDD原則を使用してDTOを実装する正しい方法は何ですか?

26
user2105030

ドメインサービスレイヤーに配置します。 DTOはそのレイヤーの出力です。そこで定義すると意味があります。

DTOをドメインレイヤーに配置しないでください。ドメインレイヤーは、そのレイヤーの外側にあるものについては気にしません。

編集:ドメインサービスレイヤーは一般に「アプリケーションサービス」レイヤーとして知られています

16
Yorro

ヨロはDTOを配置する場所については正しいですが、「DTOの考え方」を避けることをお勧めします。この考え方は、DDDの考え方と衝突します。

「ここにDTOが必要だ」と考えることは、技術的な表現を考えることです(pllxが言うように)。抽象化のレベルが低すぎます。より高いレベルの吸引力を試し、ドメイン、ユーザーのタスク、UIについて考えます。

ユーザーにビューデータを取得する必要がありますか?特定のYourViewInfoクラスを返すビューサービスを介してUIに移動します。

タスクを実行するためにサービスにデータを送信する必要がありますか?特定のTaskMessageInfoクラスまたは特定のCommandクラスを送信します。

これらのクラスの内部のモデリングを開始するのは、その技術的な表現について考え始めるときです。次に、便利なDTOクラスなどの結論に到達できます。

このように考えることは、システムのモデル化に役立ち、次のような質問を引き起こしません

これをどこに置くか、またはこれに属しますか?

10
jlvaquero

DTOとドメインは異なるレイヤーです。
そのため、あるものから別のものへのマッピングが必要であり、通常、これはいわゆるアプリケーションサービス層で行われます。
次の記事を参照して、DTOと階層化をさらに深く理解してください。

9
FireAlkazar

外の世界にさらされているそのようなDTOは、契約の一部になります。フォームに応じて、アプリケーションレイヤーまたはプレゼンテーションレイヤーが適しています。

DTOがプレゼンテーション専用である場合は、プレゼンテーションレイヤーが適しています。

それらがAPIの一部である場合、それが入力用か出力用かは、アプリケーション層の問題です。アプリケーション層は、ドメインモデルを外部の世界に接続するものです。

興味深い観察として、プレゼンテーション層はドメインモデルのみアプリケーション層を介してにアクセスする必要があります。それ以外の場合は、単一のアクセスポイントが失われます-ドメインモデルを呼び出す複数のレイヤーがあります。アプリケーション層は、すべてのユースケースを公開します。それらが別のサービスからの呼び出しによって呼び出されても、プレゼンテーション層によって呼び出されても、違いはほとんどありません。

出典

これらの概念の中核は、ボーン・バーノンによる The Red Book から学びました。 (引用すると思いますが、手元にありません。)アプリケーション層とプレゼンテーション層に関する章は関連しています。

主に、私の結論は、Eric EvansとVaughn Vernonによって提示された概念に厳密であり、これがDomain-Driven Designであるため、ドメインモデルの自由を優先することから来ています。

  • ドメインモデルは簡単に変更できる必要があります。つまり、ドメインオブジェクトを外部に公開しないことを意味します。外部の依存関係があると、ドメインオブジェクトがhardに変化するためです(物事を壊すことなく)。
  • アプリケーション層は、外部アクセスポイントです。これが、ドメインモデルのユースケースを定義するものです。つまり、他の場所からドメインモデルを操作するnotです。プレゼンテーション層は、アプリケーション層のみを通過できます。多くの異なるアクセスポイントに対処する必要はありません。
5
Timo