私の質問が初心者であれば、DDDについて謝罪しています。多くのプロパティはエンティティ/値オブジェクトの一部ではないため、ユーザーにデータを表示するには、ローカルデータ転送オブジェクトを使用する必要があると思います。
ただし、このDTOをどこに実装する必要があるのか、ドメインレイヤーまたはアプリケーションサービスレイヤーではわかりません。 DTOの実装はドメインの一部のようですが、サービスレイヤーでDTOのコレクションを作成してプレゼンテーションレイヤーに渡すときに、プレゼンテーションレイヤーでドメインレイヤーを参照する必要があることを意味しますが、これは誤りのようです。
DDD原則を使用してDTOを実装する正しい方法は何ですか?
ドメインサービスレイヤーに配置します。 DTOはそのレイヤーの出力です。そこで定義すると意味があります。
DTOをドメインレイヤーに配置しないでください。ドメインレイヤーは、そのレイヤーの外側にあるものについては気にしません。
編集:ドメインサービスレイヤーは一般に「アプリケーションサービス」レイヤーとして知られています
ヨロはDTOを配置する場所については正しいですが、「DTOの考え方」を避けることをお勧めします。この考え方は、DDDの考え方と衝突します。
「ここにDTOが必要だ」と考えることは、技術的な表現を考えることです(pllxが言うように)。抽象化のレベルが低すぎます。より高いレベルの吸引力を試し、ドメイン、ユーザーのタスク、UIについて考えます。
ユーザーにビューデータを取得する必要がありますか?特定のYourViewInfoクラスを返すビューサービスを介してUIに移動します。
タスクを実行するためにサービスにデータを送信する必要がありますか?特定のTaskMessageInfoクラスまたは特定のCommandクラスを送信します。
これらのクラスの内部のモデリングを開始するのは、その技術的な表現について考え始めるときです。次に、便利なDTOクラスなどの結論に到達できます。
このように考えることは、システムのモデル化に役立ち、次のような質問を引き起こしません
これをどこに置くか、またはこれに属しますか?
DTOとドメインは異なるレイヤーです。
そのため、あるものから別のものへのマッピングが必要であり、通常、これはいわゆるアプリケーションサービス層で行われます。
次の記事を参照して、DTOと階層化をさらに深く理解してください。
外の世界にさらされているそのようなDTOは、契約の一部になります。フォームに応じて、アプリケーションレイヤーまたはプレゼンテーションレイヤーが適しています。
DTOがプレゼンテーション専用である場合は、プレゼンテーションレイヤーが適しています。
それらがAPIの一部である場合、それが入力用か出力用かは、アプリケーション層の問題です。アプリケーション層は、ドメインモデルを外部の世界に接続するものです。
興味深い観察として、プレゼンテーション層はドメインモデルのみアプリケーション層を介してにアクセスする必要があります。それ以外の場合は、単一のアクセスポイントが失われます-ドメインモデルを呼び出す複数のレイヤーがあります。アプリケーション層は、すべてのユースケースを公開します。それらが別のサービスからの呼び出しによって呼び出されても、プレゼンテーション層によって呼び出されても、違いはほとんどありません。
これらの概念の中核は、ボーン・バーノンによる The Red Book から学びました。 (引用すると思いますが、手元にありません。)アプリケーション層とプレゼンテーション層に関する章は関連しています。
主に、私の結論は、Eric EvansとVaughn Vernonによって提示された概念に厳密であり、これがDomain-Driven Designであるため、ドメインモデルの自由を優先することから来ています。