これについては、Mosh に概ね同意します。ただし、ビジネスの観点から見たトランザクションの概念に注意してください。したがって、実際には「データ変更の目的で」を「トランザクションの目的で」と解釈します。
リポジトリは、ドメイン モデルのビューです。ドメイン環境では、これらの「ビュー」は実際にビジネス機能または機能 (トランザクション) をサポートまたは表現します。適切な例として、従業員は 1 つ以上の違反をしている可能性があり、もしそうなら、ある時点でのトランザクションの側面です。ユースケースを検討してください。
シナリオ:「従業員が職場に違反する行為を行った。」これは、発生した一種のビジネス イベント (つまり、トランザクション、またはより大規模な分散トランザクションの一部) です。影響を受けるルート ドメイン オブジェクトは、実際には複数の観点から見ることができるため、混乱を招きます。ただし、ビジネス プロセスで現実世界をできるだけ正確にモデル化する必要があるため、ビジネス トランザクションに関連する動作については覚えておく必要があります。リレーションシップに関しては、リレーショナル データベースの場合と同様に、概念的なドメイン モデルは実際にはすでにこれを示している必要があります (つまり、結合性)。多くの場合、どちらの方向にも読み取ることができます。
従業員 <---- 犯した -------犯した ----> 違反
したがって、このユース ケースでは、これは違反を扱うトランザクションであり、ルート (つまり「プライマリ」エンティティ) は違反であると言えます。それが、その特定のビジネス アクティビティまたはビジネス プロセスで参照する集約ルートになります。しかし、別のアクティビティやプロセスでは、「新しい従業員プロセス」などの Employee 集約ルートを使用できないというわけではありません。注意を払っていれば、循環参照の悪影響や、ドメイン モデルを複数の方法でトラバースできることはありません。ただし、これを管理することは、ビジネス ドメインのコントローラー部分、またはそれに相当するものによって検討および処理する必要があることを警告します。
余談: パターン (つまり MVC) の観点から考えると、リポジトリはビューであり、ドメイン オブジェクトはモデルであるため、何らかの形式のコントローラー パターンも使用する必要があります。通常、コントローラーは、リポジトリー (集約ルートのコレクション) の具体的な実装とアクセスを宣言します。
データアクセスの世界では...
例として LINQ-To-SQL を使用すると、DataContext は Customer および Order エンティティのビューを公開するコントローラーになります。ビューは、非宣言型のフレームワーク指向のテーブル型です (リポジトリとほぼ同等)。ビューはその親コントローラーへの参照を保持し、多くの場合、コントローラーを介してビューが具体化される方法/時期を制御することに注意してください。したがって、コントローラーはプロバイダーであり、マッピング、変換、オブジェクトのハイドレーションなどを処理します。モデルはデータの POCO です。かなり典型的な MVC パターン。
例として N/Hibernate を使用すると、ISession は、session.Enumerable(string query) または session.Get(object id) または session.CreateCriteria(typeof(Customer) を介して Customer および Order エンティティのビューを公開するコントローラーになります。 )。リスト()
ビジネスロジックの世界では...
Customer { /*...*/ }
Employee { /*...*/ }
Repository<T> : IRepository<T>
, IEnumerable<T>
//, IQueryable<T>, IQueryProvider //optional
{ /**/ }
BusinessController {
Repository<Customer> Customers { get{ /*...*/ }} //aggregate root
Repository<Order> Orders { get{ /*...*/ }} // aggregate root
}
簡単に言えば、ビジネス プロセスとトランザクションをガイドにして、プロセス/アクティビティが実装またはリファクタリングされるにつれて、ビジネス インフラストラクチャが自然に進化するようにします。さらに、従来のブラック ボックス デザインよりも構成可能性を優先します。サービス指向またはクラウド コンピューティングに到達すると、満足することでしょう。:)