背景: 私自身の明快さ/自己教育のために、TDD + DDD を使用して単純な注文入力アプリケーションを実装しようとしています。私の主な目標は、関心を分離することによってアーキテクチャをクリーンに保つことです。
私は(今のところ)4つのレイヤーを持っています...
「集約ルート」で GetById、保存、操作を実行できる CustomerRepository クラスを使用した持続性/DAL、Customer およびそれに関連する Orders および OrderItems。「貧乏人の依存性注入」を可能にするために
注文サイズと顧客の場所に基づいて税金、割引、配送ロジックを適用し、新しい注文を作成するのに役立つきめ細かい操作を実行する「ビジネス エンティティ」クラスを含むドメイン/BLL レイヤー。
アプリケーション ファサード (アプリ サービス / オーケストレーション) には、「ビジネス エンティティ」をオーケストレーションし、プレゼンテーション (および場合によっては Web サービス レイヤー) とのおしゃべりを減らすための分厚い粗いクラスが含まれています。
プレゼンテーション層
さらに、重要なレイヤー間で POCO DTO を渡したいと考えています。特に、Persistence=>Domain レイヤーと ApplicationFacade=>Presentation レイヤーの間です。したがって、共有パッケージで定義された適切な関係を持つ CustomerDto、OrderDto、OrderItemDto があります。
コンストラクター インジェクションを使用して ICustomerRepository の実装を Customer の "ビジネス エンティティ" クラスに挿入し、"ビジネス エンティティ" で Customer.Save() を呼び出して作成/更新プロセスを開始し、最終的に Save メソッドを呼び出します。顧客リポジトリ。結局のところ、Customer は「集約ルート」であり、保存するために必要なすべての情報を持っています...また、注入された CustomerRepository の「キーパー」でもあります。
問題: ここで問題が発生しました。Domain/BLL Layer をできるだけ純粋に保ち、サードパーティのフレームワークや API との結合を避けたいのですが、Customer.Save() メソッドは、Customer の「集約ルート」とそのすべての Orders および OrderItems を次のように変換する必要があります。注入された Persistence レイヤー CustomerRepository に転送するための DTO バージョン ... そしてそれは Automapper の仕事です。
問題は... Automapper を Domain/BLL レイヤーに配置しないと、どこに配置すればよいかよくわかりません。
仕事はオーケストレーションですが、それを ApplicationFacade に入れるのは適切ではありません。
これをドメイン/BLL レイヤーに配置するのは適切ではありません。
したがって、私は何かを見逃しているように感じます...このタスクを完了するためにすべての作業部分がどのように連携する必要があるかについて、根本的な誤解を持ってこれに取り組んでいます. 助言がありますか?(優しくしてください。私はこれに慣れておらず、SOも初めてです。これまでに持っているもののコードを表示する必要がある場合はお知らせください。)