大規模なアプリケーションを(再)設計しています。DDDに基づく多層アーキテクチャを使用しています。
データレイヤー(リポジトリの実装)、ドメインレイヤー(ドメインモデルとインターフェイスの定義-リポジトリ、サービス、作業単位)、サービスレイヤー(サービスの実装)を備えたMVCがあります。これまでのところ、すべてのレイヤーでドメインモデル(主にエンティティ)を使用し、ビューモデルとしてのみDTOを使用しています(コントローラーでは、サービスはドメインモデルを返し、コントローラーはビューに渡されるビューモデルを作成します)。
DTOの使用、使用、マッピング、および受け渡しに関する無数の記事を読んだことがあります。明確な答えはないことを理解していますが、ドメインモデルをサービスからコントローラーに返すかどうかはわかりません。ドメインモデルを返しても、コントローラーは常にビュー固有のビューモデルを作成するため、ドメインモデルはビューに渡されません。この場合、正当なようです。一方、ドメインモデルがビジネスレイヤー(サービスレイヤー)を離れると、適切に感じられません。サービスはドメインで定義されていないデータオブジェクトを返す必要がある場合があります。その場合、マップされていないドメインに新しいオブジェクトを追加するか、POCOオブジェクトを作成する必要があります(一部のサービスはドメインモデルを返すため、これは醜いです。効果的にDTOを返します)。
問題は、ビューモデルを厳密に使用する場合、ドメインモデルをコントローラーに返すことは問題ありませんか、それとも、サービスレイヤーとの通信に常にDTOを使用する必要がありますか?その場合、必要なサービスに基づいてドメインモデルを調整しても問題ありませんか?(率直に言って、私はそうは思いません。サービスはドメインが持っているものを消費する必要があるからです。)厳密にDTOに固執する必要がある場合、サービスレイヤーで定義する必要がありますか?(私はそう思います。)DTOを使用する必要があることは明らかです(たとえば、サービスが多くのビジネスロジックを実行して新しいオブジェクトを作成する場合)。ドメインモデルのみを使用する必要がある場合もあります(たとえば、Membershipサービスが貧血のUser( s)-ドメインモデルと同じDTOを作成することはあまり意味がないようです)-しかし、私は一貫性と優れた実践を好みます。
記事ドメインvs DTO vs ViewModel-それらをいつどのように使用するか?(および他のいくつかの記事)は私の問題と非常に似ていますが、この質問には答えません。記事EFのリポジトリパターンでDTOを実装する必要がありますか?も同様ですが、DDDは扱いません。
免責事項:存在していてファンシーであるためにデザインパターンを使用するつもりはありません。一方、アプリケーション全体の設計に役立ち、分離に役立つため、優れたデザインパターンとプラクティスを使用したいと思います。特定のパターンを使用するのは難しいとしても、少なくとも現時点では「必要」ではありません。
いつもありがとうございます。