私は過去 2 週間にわたって DDD を研究してきましたが、特に印象に残ったことの 1 つは、集約ルートに他の集約ルートを含める方法でした。集約ルートはリポジトリから取得されますが、ルートに別のルートが含まれている場合、リポジトリには他のリポジトリへの参照があり、サブルートを構築するように求めていますか?
3 に答える
@パコ:あなたは間違っています。リポジトリは、オブジェクトを格納するためだけのものではありません。Eric EvanのDDDの本を読んだことがあれば、リポジトリはデータのオブジェクト指向のメモリ内表現のようなものであることをご存知でしょう。コレクションを使用するのと同じ方法でリポジトリオブジェクトを使用できます。インデクサーを使用してオブジェクトを取得または設定したり、Add()メソッドを使用して新しいオブジェクトを追加したり、Remove()メソッドを使用してオブジェクトを削除したりできます。
次に、リポジトリはインフラストラクチャを使用して、データベースとの間でデータの読み取り/書き込みを行います。DataMapperを使用して、リレーショナルデータベースからのデータの取得とエンティティへのマッピングを簡素化できます。
リポジトリは構築されませんが、保存されます。dddを使用する場合は、作業単位、IDマップ、遅延ロード、オブジェクトリレーションマッパー、クエリオブジェクト、(動的)プロキシなどの基本的な永続性パターンに精通している必要があります。(これらのパターンはdddとは関係ありませんが、知っておくと非常に便利です)。リポジトリは、前述のパターンの実装を非表示にし、ドメイン駆動方式でデータアクセスを抽象化するための単なるファサードです。最近では、ほとんどの人が永続化インフラストラクチャを手動で作成していません。特にdddを使用している場合は、ormを確認することをお勧めします。
データベースレコードをオブジェクトに変換するコードの実際の参照は、データマッパーにあります。マッピングクラス自体のマッピングクラス間に参照があるか、マッパーファクトリーのようなものによって作成されます。
public interface IDataMapper<T>
{
T Map(IDataReader reader);
}
このコードを自分で実装する必要はありません。それを実行するツールを使用して、ツール(orm)のコードの一部がどのように機能するかを理解してください。ormのない純粋なdddは、多くのコードを書くことからあなたを救う優れたツールのセットなしではほとんど不可能です。
私の意見からすると、それは異なります-私は同じシナリオを持っており、これに対処する方法は、私が使用しているORM-nHibernateを介しています。
すべてのエンティティのマッピングがあり、そのうちのいくつかは集約ルートであり、そのうちの 1 つにはメンバー変数として他のいくつかの集約ルートがあります。nHibernate は (マッピングを介して) 必要なすべてのデータを取得する方法を知っているため、この複合集約ルートのリポジトリは他の集約ルート リポジトリへの参照を必要としません。
HTH
AWC