私はまだDDDを調査していますが、潜在的な落とし穴の1つについて知りたいのです。ドメインドリブンデザイン(DDD)とデータベース生成レポート
DDDによれば、aggregate-rootは永続性について知ってはいけませんが、aggregate-root全体がメモリ上でインスタンス化されることになりますか?
たとえば、集約ルートは、永続性を認識していないと思われるデータをグループ化して合計するようにデータベースに要求することはできますか。
私はまだDDDを調査していますが、潜在的な落とし穴の1つについて知りたいのです。ドメインドリブンデザイン(DDD)とデータベース生成レポート
DDDによれば、aggregate-rootは永続性について知ってはいけませんが、aggregate-root全体がメモリ上でインスタンス化されることになりますか?
たとえば、集約ルートは、永続性を認識していないと思われるデータをグループ化して合計するようにデータベースに要求することはできますか。
DDDによると、aggregate-rootは永続性について知ってはいけませんが、集約ルート全体がメモリ上でインスタンス化されることになりますか?
ああ、それはそれより悪いです。 アグリゲート(ルートおよびすべての従属エンティティ)がロードされ、メモリにインスタンス化されます。本質的に定義すると、変更を検証するためにロードされたすべての状態が必要です。
たとえば、集約ルートは、永続性を認識していないと思われる多くのデータをグループ化して合計する方法をデータベースに要求することはできますか。
これを実行するためにaggregate-rootは必要ありません。
ドメインモデルの主な役割は、すべての書き込みがビジネス不変であることを保証することによって、記録簿の完全性を保証することです。データベースレポートのように、読んでもレコードの本は変更されないので、ドメインモデルを読み込む必要はありません。
ドメインモデル自体にレポートが必要な場合は、通常、レポートに必要なレポートを指定するサービスプロバイダインターフェイスが定義されており、そのインターフェイスの実装方法を把握するのは、持続コンポーネントです。
DDDによると、aggregate-rootは永続性について知ってはいけませんが、aggregate-root全体がメモリ上でインスタンス化されることになりますか?
集約ルーツは一貫性の境界です。したがって、通常、インバリアントを強制するために集約全体をメモリにロードします。これが問題のように思えるのであれば、集約が大きすぎ、おそらくリファクタリングを必要としないというヒントかもしれません。
たとえば、集約ルートは、永続性を認識していないと思われる多くのデータをグループ化して合計する方法をデータベースに要求することはできますか。
集計では、データベースに集計とデータの合計を求めることはありません。通常は、アプリケーションサービス/コマンドハンドラで集計をロードします。例:
public class SomeUseCaseHandler : IHandle<SomeCommand>
{
private readonly ISomeRepository _someRepository;
public SomeUseCaseHandler(ISomeRepository someRepository)
{
_someRepository = someRepository;
}
public void When(SomeCommand command)
{
var someAggregaate = _someRepository.Load(command.AggregateId);
someAggregate.DoSomething();
_someRepository.Save(someAggregate);
}
}
したがって、集約はそれがどのように保持されるかを無視したままです。ただし、ISomeRepositoryの実装はではなく、であるため、集約を完全にロードするために必要な作業はすべて実行できます。集計をロードするときだから、はあなたの永続化の実装グループ/合計を持っている可能性がありますが、多くの場合、あなたはおそらく読み取りモデルを照会します:
public class SomeUseCaseHandler : IHandle<SomeCommand>
{
private readonly ISomeRepository _someRepository;
private readonly ISomeReadModel _someReadModel;
public SomeUseCaseHandler(ISomeRepository someRepository, ISomeReadModel readModel)
{
_someRepository = someRepository;
_someReadModel = someReadModel;
}
public void When(SomeCommand command)
{
var someAggregaate = _someRepository.Load(command.AggregateId);
someAggregate.DoSomethingThatRequiresTheReadModel(_someReadModel);
_someRepository.Save(someAggregate);
}
}
あなたが実際にあなたのユースケースがが何であるかを述べていません。 :)
[更新]
ただタイトルがデータベースを参照するに気づいたレポートを生成 - これは、すべてあなたのドメインモデルを経由しないであろう、それは完全に別の読み取りモデルになります。 CQRSがここに適用されます
明確にするため、ユースケースは複数のタイムシートエントリが添付されており、それぞれに金額が付いた契約です。 契約に費やされた合計金額は、タイムシートエントリの金額の合計によって計算されます。 –
通常、契約ごとにいくつのタイムシートエントリがありますか?エントリを追加する際に適用するビジネスルールはありますか? – tomliversidge
これは、60から750のエントリまで変化する可能性があります。選択したレートを確認することが、契約および時間/日付に対して有効であるなど、施行するビジネスルールがあります。 –