5

エンティティごとのリポジトリから集約ルートごとのリポジトリにアプリケーションをリファクタリングしようとしています。

基本的な例として、Cars のエンティティ ルートがあるとします。車にはレンタカー契約があります。私が見る限り、契約は車なしでは存在しないため、車は集約ルートです。

システム内のすべてのコントラクト (ルート エンティティのすべての子エンティティ) を表示するユーザー ビューを実装しようとしています。リファクタリングする前に、コントラクト リポジトリに移動して All を取得するだけで済みました。コントラクト リポジトリが削除されたため (ルートではないため)、すべての車をリポジトリから取り出して、すべてのコントラクトを取得する必要があります。

私のリポジトリにはインターフェースがあります

public interface ICarRepository
{
    IQueryable<Car> All { get; }
    IQueryable<Car> AllIncluding(params Expression<Func<Car, object>>[] includeProperties);
    Car Find(long id);
    void InsertOrUpdate(Car car);
    void Delete(long id);
    void Save();
}

ICarManagementService を作成し、GetAllContracts メソッド (おそらくフィルター パラメーターを使用) を持たせることを考えました。それは、契約ですべての自動車エンティティを引き出してから、雇用契約に関連付けられている各エンティティを取得してそれらをフィルタリングするために必要なすべての契約を取得することを意味しますか?

次に、これらをコントローラーに渡し、以前と同じようにコントラクトを AutoMap します。

これはベストプラクティスですか?

ありがとう

グレアム

4

2 に答える 2

5

私が見る限り、契約は車なしでは存在しないため、車は集約ルートです。

これは必ずしも真実ではありません。「なしでは存在しない」というだけでは、エンティティが集約ルートの一部になるには不十分です。従来の注文処理ドメインを検討してください。集約ルートである注文があります。集約ルートである Customer もあります。注文は顧客なしでは存在できませんが、注文が顧客集合体の一部であることを意味するものではありません。1 つの集約内の DDD エンティティでは、他の集約ルートへの参照を持つことができます。DDDの本から:

AGGREGATE 内のオブジェクトは、他の AGGREGATE ルートへの参照を保持できます。

Aggregate はライフサイクルとデータ交換の単位です。これは基本的に、不変条件を適用するオブジェクトのクラスターです。複数のユーザーが同時にドメインを変更している場合、これはロックしたいものです。

質問に戻りますが、私の理解では、ドメインはレンタル/リース車/トラック/リムジン/ブルドーザーのようなものです。HireContract は Car 集合体の一部ではない可能性があると思います。なぜなら、ライフサイクルが異なる可能性があり、HireContract は Car がなくても単独で意味があるからです。これは、互いに参照する 2 つの異なる集合体の典型的な例でもある、注文と製品の関係のようです。この理論は、ビジネスが「すべての契約」を見る必要があるという事実によっても確認されます。彼らはおそらく Car にすべての Contract が含まれているとは考えていません。これが当てはまる場合は、ContractsRepository を保持する必要があります。

関係のない話ですが、リポジトリ インターフェイスの設計に関するこの回答を読むことに興味があるかもしれません。

于 2011-09-18T12:38:35.163 に答える
4

読み取り/クエリの概念を書き込み/コマンドから分離します。CQRS のガイドに従って、読み取り専用クエリで構成される読み取りモデルと、特定のロジックを実行するコマンドで構成される書き込みモデルを分離して、アプリケーションを設計することをお勧めします。ドメイン モデルで。

したがって、すべての集約ルートを照会したり、カスタム クエリを作成してデータ セットを結合したりすることは、ドメイン リポジトリの適切な候補ではありません。代わりに、これらのクエリを読み取りリポジトリ (またはより適切な名前の Finder) に配置します。

ドメインロジックを実行するためにオブジェクトのコレクションを照会したい場合は、このコレクションを抽象化し、集約ルートに入れてカプセル化し、ビジネス操作またはメソッドをそれらに作用させる必要があることを示しています.

(http://moh-abed.com/2011/09/13/pure-old-ddd-with-a-twist-from-cqrs/) と (http://simon-says-architecture.com/ 2011/08/23/リポジトリ)

于 2011-09-18T11:48:03.037 に答える