8

リポジトリ クラスはどの層に配置する必要がありますか? ドメインまたはインフラストラクチャ?

4

4 に答える 4

22

リポジトリインターフェイスはドメインの一部です。インターフェイスの実際の実装は、インフラストラクチャの一部である必要があります。

于 2010-08-23T07:00:23.190 に答える
4

リポジトリ実装クラスは、別個のインターフェース (存在する場合) とともにドメイン層に入る必要があります。

その理由は、階層化されたアーキテクチャで従うべき基本的な規則によって与えられます。下位層は上位層に依存してはなりません

このルールを受け入れると (そうでなければレイヤード アーキテクチャではありません)、リポジトリの実装をインフラストラクチャ レイヤーに配置すると、ドメイン レイヤーに依存することになり、レイヤー化の基本ルールに違反します。

たとえば、新しいドメイン エンティティを作成するときは、それをドメイン レイヤーに配置します。また、リポジトリ (インターフェースと実装の両方) は必然的にドメイン エンティティに依存する必要があるため、リポジトリもドメイン層に入る必要があることを意味します。そうしないと、ドメイン エンティティがドメイン レイヤーで追加/削除/変更されるたびに、インフラストラクチャ レイヤーを変更することになります。

ドメイン層を「クリーン」に保ち、永続性の詳細から独立させるなどのその他の問題は、ドメイン層内の実装から適切なインフラストラクチャ サービスを使用することで達成でき、また達成する必要があります。たとえば、Java では、JPA を使用して非常に少ないコードでリポジトリを実装でき、SQL/JDBC またはデータベース固有のコードはありません (JPA でリポジトリを実装することが本当に良い考えかどうかは別の議論です。いずれにせよ、JPA エンティティはとにかくJPAアノテーションを利用してください)。

参考文献:ウィキペディアMSDN

于 2015-04-09T20:56:54.780 に答える
2

リポジトリ クラスの実装は、インフラストラクチャ レイヤーに配置する必要があります。リポジトリ インターフェイスはサービス層にある必要があります。

ドメイン層はリポジトリについて何も知らないはずです。DDD の戦略的パターンでは、ドメイン層は常に概念モデルと同期する必要があると述べています。つまり、ドメイン層はよく知られているドメイン プロセスをコードに変換する必要があり、その逆も同様です。また、ドメイン プロセスは、ドメインの専門家がよく知っている必要があります。また、ドメインの専門家はリポジトリについて何も知りません。

それについて考える別の方法。リポジトリまたはリポジトリのインターフェイスをドメイン層に配置するとします。つまり、ドメイン層コードにリポジトリの概念ができました。また、ドメイン層はドメインの概念モデルと同期している必要があります。では、概念モデルにおけるリポジトリの表現は何かを自問してみましょう。正解は、概念モデルにリポジトリがないことです。したがって、リポジトリをドメイン層に配置することはできません。

とはいえ、ドメイン層にリポジトリがあり、プロジェクトのエンジニアがまだそれを DDD プラクティスと呼んでいるプロジェクトに出くわすことはまだあります。ここでの問題は、人々が DDD の中心にある戦略的パターンにあまり注意を払っておらず、コーディング作業を少し簡素化する可能性のある戦術的パターンをいじっていることだと思います。

于 2021-04-20T12:42:01.790 に答える
0

それはあなたが彼らにどのように頼るかによると思います。

質問は、ドメイン内からリポジトリを使用することを許可しますか?
もしそうなら、あなたはそれらを入れることを余儀なくされています.

私自身、それらをドメインの外に置くのが好きです。つまり、何かの典型的なライフサイクルは次のようになります =>

UI => コントローラー => リポジトリから集約ルートを取得する => 集約ルートを介してロジックを呼び出す => 新しい集約ルートが作成された場合は、それをリポジトリに追加します。

コントローラーは、ルートを取得して関数を呼び出すだけでなく、追加の処理を行うアプリケーション サービスを呼び出す場合があります。しかし、考え方は同じです。ドメインは持続性について何も知りません。


(私が見ているように)リポジトリをドメインに配置すること(または少なくともそれらの抽象化)に問題はありませんが、ドメインが永続性をより認識できるようになります。これで問題が解決する場合もありますが、一般的には、ドメインがより複雑になることは間違いありません。

あなたにとってより自然に見えるものを使用し、いつでもあなたの方法を切り替える準備をしてください.

于 2010-08-17T08:58:26.817 に答える