web-dev-qa-db-ja.com

DDDリポジトリとファクトリ

私のアプリケーションでは、いくつかのレイヤー。このトピックでは、ドメイン層とインフラストラクチャ層に焦点を当てます。

ドメインレイヤーにリポジトリインターフェイスClientRepositoryInterfaceがあります。そして、インフラストラクチャ層にこのインターフェイスClientRepositoryImplを実装しています。

しかし、その存在のサイクルの途中でオブジェクトを再構成するには、factory(ReconstitutionClientFactory)が必要です。工場に電話すると、リポジトリにあります。エリック・エバンスの本は、通常の習慣として説明されています。

しかし、このファクトリ(ReconstitutionClientFactory)はどこに配置する必要がありますか?ドメイン内またはインフラストラクチャ層内?

私はドメインで考えています...しかし!しかし、その場合、下位層は直接上位層を呼び出します!これは間違っていますが、どのように正しく行うのですか?

13
stalxed

まず第一に、レイヤーアプローチはちょっと時代遅れです。レイヤーを話すときは、「コンテキスト」を考えます。誰が誰の上にいるかは重要ではありません。

リポジトリは復元オブジェクトを担当します。ファクトリは作成新しいオブジェクトです。異なるセマンティクスに注意してください。リポジトリは、永続性への保存/永続化からの復元がどのように行われるかを認識しており、それはストレージとアクセス方法によって異なります。

したがって、すべてはリポジトリ内、つまりインフラストラクチャ内で行われます。物事をシリアル化する場合は、逆シリアル化するだけで済みます(これは、ドキュメントデータベースがとにかく物事を行う方法です)。 ORMを使用している場合、またはテーブルに格納している場合は、データを取得してオブジェクトを再作成するために必要なすべてのクエリを実行します。 ORMは、リフレクションを使用してプライベートプロパティにデータを入力できるため、最も簡単な方法です。この場合、ORM自体がファクトリです。

もう1つ、復元は、技術的にはドメインファクトリで実行できますが、レイヤの境界を壊すため、ファクトリの目的ではありません。インフラストラクチャに関連するすべての永続性を維持したいと考えています。

14
MikeSW

工場とリポジトリの概念

あなたの質問に答えるには、DDDによって定義された概念の責任に焦点を当てることが重要だと思います。

ブルーブックには、あなたが説明する問題を扱うセクションがあります。

FACTORYは、オブジェクトの寿命の始まりを処理します。 REPOSITORYは、中間と終了の管理に役立ちます。

特にあなたの質問のために:

この場合、REPOSITORYはデータに基づいてオブジェクトを作成するため、多くの人がREPOSITORYをファクトリーと見なします。実際、技術的な観点からはそうです。

(両方ともエバンスの第6章「工場との関係」のセクションからの引用)

概念を純粋に保つために、工場とリポジトリのインターフェースがクリーンであることが重要です。したがって、リポジトリインターフェイスを介して新しいビジネスオブジェクトを作成したり、ファクトリインターフェイスを介して既存のビジネスオブジェクトをクエリしたりしないでください。

ただし、インターフェイスをクリーンに保つことは、リポジトリの実装からファクトリを使用してはならないという意味ではありません。結局のところ、リポジトリはある時点でインスタンスを作成し、そのインスタンスの場合は作成は複雑で、工場が適切なソリューションです。

エヴァンスをもう一度引用するには:

別のメディアからオブジェクトを再構成する際に複雑さが露呈する場合は常に、FACTORYが適切なオプションです。

ただし、リポジトリは、(再構成ではなく)実際に新しいドメインオブジェクトを作成するクライアントとは異なるメソッドをファクトリで呼び出す可能性が高いことに注意してください。

エヴァンスの本には、アプローチを説明する例さえあります。

Domain object reconstitution with help of a factory

あなたの質問に答える

これが許可されていることが明らかになったので、ファクトリをどこに配置するかという質問に焦点を当てましょう。

DDDファクトリインターフェイスはドメインに属します。これは、ドメインロジックがこれを使用してドメインオブジェクトを作成するためです。

DDD再構成ファクトリインターフェイスは、リポジトリにのみ関連するため、ドメインに属していません。ドメインの現実の世界には存在しません。

ここで、ドメインからインフラストラクチャへの依存関係を禁止するアーキテクチャを使用している場合(DDDを適用する場合はおそらくそうする必要があります)、ファクトリ実装はインフラストラクチャに属しますであることは明らかです。レイヤーをレイヤー、リング、レルムなどと呼ぶかどうかは関係ありません。依存関係は重要な部分です。

34
theDmi