假設你有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