假设您有2个类,Person和Rabbit。一个人可以为兔子做很多事情,他/她可以喂它,买它并成为它的主人,或者放弃它。一只兔子一次可以没有或最多只有1个主人。如果它暂时没有喂食,它可能会死亡。
Class Person
{
Void Feed(Rabbit r);
Void Buy(Rabbit r);
Void Giveaway(Person p, Rabbit r);
Rabbit[] rabbits;
}
Class Rabbit
{
Bool IsAlive();
Person pwner;
}
域模型中有一些观察结果:
就DDD而言,我认为正确的方法是同步所有可能改变域模型中状态的调用。例如,如果一个人购买了一只兔子,他/她将需要在Person中获取一个锁以对兔子阵列进行更改,并且还需要在Rabbit中另一个锁定以在释放第一个之前更改其所有者。这可以防止2人声称是小兔子的拥有者的竞争条件。
另一种方法是让数据库处理所有这些同步。谁使第一次调用获胜,但是数据库需要具有某种业务逻辑以确定它是否是有效的事务(例如,如果Rabbit已经拥有所有者,除非Person将其删除,否则它不能更改其所有者)
两种方法都有优点/缺点,我希望“最佳”解决方案介于两者之间。你会如何在现实生活中做到这一点?你的经历和经历是什么?
此外,域模型是否已提交其更改但在数据库中完全提交之前可能存在另一种竞争条件,这是否是一个有效的问题?
对于第3次观察(即由于时间因素引起的状态变化)。你会怎么做?
答案 0 :(得分:1)
这里有几个需要考虑的问题,可以帮助你进行设计:
答案 1 :(得分:1)
第三。当然老板拥有一只死兔子?但它足以作为杀死兔子的一部分,你将它从它的主人身上移除。至于什么杀死兔子,也许你需要课程GrimReaper及时安排查看所有ILivingThings,如果生命条件得到维持,如果不是ILivingThing.Slaughter()。Reap();