【发布时间】:2010-05-05 03:49:45
【问题描述】:
假设你有 2 个类,Person 和 Rabbit。一个人可以对兔子做很多事情,她/他可以喂它,买它并成为它的主人,或者把它送人。一只兔子一次可以没有或最多有一个主人。而且如果一段时间不喂,它可能会死。
Class Person
{
Void Feed(Rabbit r);
Void Buy(Rabbit r);
Void Giveaway(Person p, Rabbit r);
Rabbit[] rabbits;
}
Class Rabbit
{
Bool IsAlive();
Person pwner;
}
领域模型有几个观察结果:
- Person 和 Rabbit 可以相互引用
- 对一个对象的任何操作也可以改变另一个对象的状态
- 即使没有调用显式操作,对象中的状态仍然会发生变化(例如,兔子可能会被饿死,这会导致它从 Person.rabbits 数组中移除)
就 DDD 而言,我认为正确的做法是同步所有可能更改域模型中状态的调用。例如,如果一个 Person 购买了 Rabbit,他/她需要在 Person 中获取一个锁来更改 rabbits 数组,并且还需要在 Rabbit 中获取另一个锁来更改其所有者,然后再释放第一个锁。这将防止出现 2 个人声称是小兔子的所有者的竞争条件。
另一种方法是让数据库来处理所有这些同步。谁打第一个电话就赢了,但是数据库需要有某种业务逻辑来确定它是否是一个有效的交易(例如,如果兔子已经有一个所有者,它不能改变它的所有者,除非这个人把它给了) .
这两种方法各有利弊,我希望“最佳”解决方案介于两者之间。在现实生活中你会怎么做?你的看法和经验是什么?
此外,域模型已提交其更改但在它完全提交到数据库中之前可能存在另一个竞争条件,这是一个有效的担忧吗?
对于第三次观察(即由于时间因素导致的状态变化)。你会怎么做?
【问题讨论】:
-
你正在构建一个本土的 ORM 吗?您是否正在尝试选择现成的 ORM?不同的 ORM 以不同的方式处理这些场景,但有一些共性。你想在大局中完成什么?
标签: database orm synchronization domain-driven-design