「startTime」値オブジェクトを持つ集約ルートがあります。さまざまな時点で、AR がさまざまな動作 (AR の内部と外部の両方) を強制するために "開始" したかどうかを判断する必要があります。また、パフォーマンス上の理由から、ストレージ層で集約ルートを「開始」状態でフィルタリングできるようにする必要もあります。
これを DDD に適した方法で実装する方法がわかりません。状態の変更を外部ソース (スケジュールされたイベント ハンドラー) に公開し、状態を明示的に定義することを検討しました。
public class AggregateRoot {
private Time startTime;
private boolean started;
...
public void start() {
started = true;
}
public boolean isStarted() {
return started;
}
}
これには、ストレージ レイヤーでのクエリが簡単であるという利点がありますが、startTime 値オブジェクトが冗長になり、AR が定義された startTime で状態を切り替えることを強制するものがドメイン内にないため、奇妙に思えます。
また、「now」と「startTime」の比較に基づいて状態を暗黙的に定義することも検討しました (AR の構築時または getter のいずれかで、例は getter にあります)。これは、AR が自身の状態などを完全に制御できることを意味しますが、このロジックを複製せずに状態によってストレージ レイヤーでクエリをフィルター処理できないことを意味します (保守性に問題があります)。
public class AggregateRoot {
private Time startTime;
...
public boolean isStarted() {
return now().isAfter(startTime);
}
}
時限ベースの状態変化を処理するための既存のパターンはありますか? これにアプローチするより良い方法はありますか?