集計ルートで計算されたプロパティを永続化する必要があります。計算は子エンティティに基づいています。ルートを使用して、ドメイン メソッドを介して子を追加/削除しています。これらのメソッドは、計算プロパティを更新します。
子エンティティは、システムの複数のユーザーが特定のルートに追加できます。たとえば、UserA は子を Root123 に追加でき、UserB も子を Root123 に追加できます。
複数のユーザーが異なるトランザクションで同じルートに子エンティティを追加している可能性がある場合、この計算されたプロパティが正確に保持されるようにするにはどうすればよいですか? 私の特定のケースでは、ルートの別のプロパティによって設定されているように、計算されたプロパティを使用して、制限を超えないようにしています。
問題のより具体的な例を次に示します。
public class RequestForProposal : AggregateRoot {
...
private ISet<Proposal> _proposals = new HashedSet<Proposal>();
public virtual int ProposalLimit { get; set; }
public virtual int ProposalCount { get; protected set; }
public virtual IEnumerable<Proposal> Proposals {
get { return _proposals; }
}
...
public virtual void AddProposal(User user, Content proposalContent) {
if (ProposalCount >= ProposalLimit) {
throw new ProposalLimitException("No more proposals are being accepted.");
}
var proposal = new Proposal(user, proposalContent);
_proposals.Add(proposal);
ProposalCount++;
}
public virtual void RemoveProposal(Proposal proposalToRemove) {
_proposals.Remove(proposalToRemove);
ProposalCount--;
}
}
2 人のユーザーがほぼ同時に提案を送信した場合はどうなりますか? UI は、まだ制限に達していないことを確認し、両方のユーザーに提案を送信するための Web ページを表示します。最初のユーザーが送信すると、すべてがうまくいきます。これで、最初のユーザーが 2 番目のユーザーの前に送信する限り、2 番目のユーザーは問題ありません。2 番目のユーザーが送信すると、DB からデータが取得され、制限が正確になります。
これは論点ですか?2 人のユーザーがほぼ同時に送信するまれなケースでは、DB の制約 (ProposalLimit >= ProposalCount) に依存する必要がありますか?