假设你有2个类,Person和Rabbit。一个人可以为兔子做许多事情,他/她可以喂它,购买它并成为它的主人,或者把它拿走。一只兔子一次只能拥有一个或最多一个拥有者。如果一段时间没有喂食,它可能会死亡。一般的ORM设计问题
Class Person
{
Void Feed(Rabbit r);
Void Buy(Rabbit r);
Void Giveaway(Person p, Rabbit r);
Rabbit[] rabbits;
}
Class Rabbit
{
Bool IsAlive();
Person pwner;
}
有一对夫妇从域模型的观察:
- 人与兔子可以有1个对象相互
- 任何行动的引用也可以改变其他对象的状态
- 即使没有明确的动作被调用,对象中的状态仍然可能会发生变化(例如,兔子可能会饿死,并导致它从Person.rabbits数组中移除)
就DDD而言,我认为正确的方法是同步可能会改变域模型状态的所有调用。例如,如果一个人购买了一只兔子,他/她将需要获得一个人为的锁,以便对兔子阵列进行更改,并且在释放第一只兔子之前,还需要另一只兔子的锁来更换它的主人。这将防止2人声称是小兔子的拥有者的竞赛状况。
另一种方法是让数据库处理所有这些同步。谁让第一个电话获胜,但是后来数据库需要有某种业务逻辑来确定它是否是有效的交易(例如,如果一个兔子已经拥有一个拥有者,除非这个人将它给予了,否则它不能改变它的拥有者) 。
这两种方法都有优点/缺点,我期望“最佳”解决方案将介于两者之间。你如何在现实生活中做到这一点?你有什么需要和经验?
另外,在域数据库完全提交之前,域模型是否承诺进行更改可能存在另一种竞争条件,这是否是一个有效的担忧?
第三次观察(即由于时间因素导致的状态变化)。你会怎么做?
你正在建立一个家庭种植的ORM吗?您是否尝试选择现成的ORM?不同的ORM以不同的方式处理这些场景,但有一些共同点。你想要在大局中完成什么? – 2010-05-05 11:18:56