【发布时间】:2010-11-05 17:44:27
【问题描述】:
我需要使用聚合根来保存计算属性。计算基于子实体。我正在使用根通过域方法添加/删除子项,这些方法会更新计算属性。
系统的多个用户可以将子实体添加到特定的根。例如,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)?
【问题讨论】:
-
我从来没有需要,但这看起来可能是一个数据库锁的应用程序。
-
我考虑过使用锁,但不确定是否值得进行可能的争用。
标签: c# nhibernate concurrency domain-driven-design aggregateroot