2009-08-03 54 views
1

我不是100%確定我已經正確地實現了我的Repository和UnitOfWork模式,但是然後我看不到這將如何工作。UnitOfWork模式和原子操作

例如,我有兩個對象,Apple和Orange。

蘋果通過OrangeID加入到橙色,像這樣:

public class Apple 
{ 
    public int OrangeID { get; set; } 
} 

我想創建一個新的蘋果和一個橘子新的,我想設置適當的ID連接起來。但我有一個問題。在將Orange保存到數據庫之前,我不會知道OrangeID。

因此,這意味着我將有以下:

var unitOfWork = new UnitOfWork(); 
Orange newOrange = new Orange(); 
OrangeRepository.Insert(newOrange); 
unitOfWork.Commit(); 

//newOrange will have been updated with the actual ID 
Apple newApple = new Apple(newOrange.ID); 
etc... 

這不是一個原子操作,除非我有位於上述外側的事務。但我認爲這就是UnitOfWork應該處理的事情?或者我的UnitOfWork.Commit()應該在寫入數據庫時​​分配適當的值?

任何幫助/提示,​​將不勝感激,謝謝 鄧肯

回答

1

首先,我不認爲這是一個蘋果和Orange實體之間的關係。 這只是一個蘋果有一個名爲OrangeID的數字屬性。您的代碼應該是這樣的:

Apple apple = new Apple(newOrange); 
AppleRepository.Insert(apple); 
unitOfWork.Commit(); 

然後,您可以檢查如果db關係已正確建立。 所以現在沒有證據如果你的工作單元實施工作與否。

此外,有很多可用的實現,如果你想節省你的一些時間。

雖然,我已經重新發明輪子,我用我的:)

的實現如果你想有一個窺視它在谷歌代碼託管: ws-helpers項目。我需要時間把它作爲一個獨立的項目,因爲它實際上是以前項目的一部分。

當然,最着名的實現是Rhino-Tools/UnitOfWork。 但是,我更喜歡我的,因爲我可以根據需要創建任意數量的單位,每個單位都有單獨的交易,而在Rhino-Tools中,總是隻有一個當前單位。但我不確定當前實現的線程安全性。