我需要使用聚合根来持久化计算属性。计算基于子实体。我正在使用根通过域方法添加/删除子项,这些方法会更新计算属性。
系统的多个用户可以将子实体添加到特定根。例如,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 发现尚未达到限制,并显示网页以向两个用户提交提案。当第一个用户提交时,一切都很好。现在,只要第一个用户在第二个用户之前提交,第二个用户就可以了,这样当第二个用户提交时,从数据库中检索数据并且限制是准确的。
这是一个有争议的问题吗?对于 2 个用户几乎同时提交的罕见情况,我是否应该依赖数据库中的约束(ProposalLimit >= ProposalCount)?