リポジトリは、動作とトランザクションを中心に設計されたドメイン集約のみを処理する必要があります。
コマンドを処理するとき、アプリケーション層(Webサービス)はドメインモデルでロジックを呼び出し、集約をリポジトリに保存する必要があります。
クライアントがWebサービスからのデータを必要とする場合、2つのオプションがあります。
- リポジトリから集計を取得し、それらをPOCO DTOにマップします(おそらくAutoMapperを使用します)。
- DTOに直接データをクエリするための薄いデータアクセス層を作成します。
後者のアプローチが私の好みです。私が言ったように、ドメインアグリゲートは動作とトランザクションによって設計されるべきです。画面にデータを表示するようには設計されていません。適切に設計された(つまり、適切にカプセル化された)ドメインエンティティからデータのコンシューマー(UIなど)のDTOにデータをマッピングしようとするのは、常に厄介なプロセスです。丸い穴に四角いペグです。私の意見では、クライアントが必要とするデータを返す薄いデータアクセス層を提供する方がはるかに簡単です。ドメインモデルはこのプロセスに関与する必要はありません。それは単なるデータです。これがCQRSの基本原則です。
いずれの場合も、ドメインエンティティをDTOに変換するのはアプリケーション層(Webサービス)である必要があります。