0

この例を見てください。Supervisorドメイン クラスは、 GetUnderlings(DateTime from, DateTime to)メソッドを公開します。このメソッドは、指定された期間に指定されたスーパーバイザによって監督されたすべての人を返します。

セマンティック上の理由から、メソッドはここに配置する必要があります。しかし、DDD の純粋さを求めるなら別の場所に行くべきです。これは、リポジトリを使用するために必要なメソッドを実装することを想定しているためです。これをドメイン エンティティ内に埋め込むのは間違っているようです。その場合、メソッドはリポジトリまたはサービスに移動する必要があります - GetUnderlings(Supervisor Supervisor, DateTime from, DateTime to)

他の人はこのシナリオをどのように処理しますか?

編集: 力は次のように説明できると思います: OO プリンシパルによると、エンティティのパブリックインターフェイスで豊富なビジネス指向の機能を公開する必要があります。しかし、DDD 実装の原則によると、そのようなメソッドの実装は別の場所に配置するのが最適かもしれません。たとえば、サービスで。

この明らかな矛盾をどのように解決できますか? 私が見ることができる方法は次のとおりです。

  1. エンティティにサービスまたはサービス インターフェイスへの参照を持たせる
  2. エンティティに直接ではなく、常にクライアントをサービスに移動させます (結果: 一貫性が失われ、オブジェクト指向の観点からはまったくクールではありません)。
  3. 「ドメイン イベント」を使用する (?)
  4. AOP トリックを使用して、メソッドの実装をサービスに委譲します。
4

3 に答える 3

0

Supervisor 集約に属している場合、Supervisor には Underlying のコレクションが必要です。

お気に入り

class Supervisor {
    private Collection<Underlying> underlyings;
}

次に、GetUnderlings(DateTime from, DateTime to) は unlyings をフィルタリングします。これで問題ありません。

ただし、スーパーバイザーに属する基盤が多すぎる場合、このソリューションはパフォーマンスに優しくありません。この場合、Underlying を集約ルートにし、そのリポジトリを使用して次のような結果を取得します。

interface UnderlyingRepository {
      Collection<Underlying> GetUnderlings(Guid supervisorId, DateTime from, DateTime to);
}

クライアント (おそらく MVC コントローラー) はリポジトリを直接呼び出します。問題は、Supervisor 集約によって保護されていた addUnderlying の不変式をどのように保護するかです。DomainService または DomainEvents のいずれかを使用できます。

上記のソリューションは、従来の DDD アーキテクチャ モデルに基づいています。@jlvaquero が言ったように、代わりに CQRS を使用できます。

于 2013-10-19T00:59:52.873 に答える
0

一般的なアプローチSupervisorは、すべてのUnderlingsを読み取り専用コレクションとして公開することです。また、日付範囲でフィルター処理するメソッドを実装する必要がある場合は、このメソッドをクラスSupervisoras に追加するだけGetUnderlings(DateTime from, DateTime to)ですべてが機能します。

Supervisor多くの があるために一般的なアプローチが機能しない場合Underlings、またはこれらすべてを取得するのに時間がかかる場合Underlings、または ... 回避策があります-Martin Fowler による ' Separated Interface ' (PoEAA) パターン。

Underlingsドメイン モデルで特定の日付範囲内に戻るコンポーネントのインターフェイスを定義できますが、それを別のレイヤー (データ アクセス レイヤーなど) に実装できます。

この場合、ドメイン エンティティにはサービスへの参照がなく、「アンダーリング」は公開されません。「Underlings」コール サービスを取得し、「Supervisor」のインスタンスをメソッドと日付範囲に渡す必要があるすべてのクライアント。

ここに画像の説明を入力

于 2013-10-18T21:02:06.240 に答える