比方說,我們有一個類型爲Order的聚合根實體,它與客戶和訂單行相關。當我考慮一個訂單實體時,將其概念化爲沒有Id的定義更自然。沒有Id的訂單似乎更好地表示爲訂單請求而非訂單。應該如何表示將聚合根添加到存儲庫?
到訂單添加到資料庫,我平時見人實例沒有編號的順序,然後讓庫完成對象:
class OrderRepository
{
void Add(Order order)
{
// Insert order into db and populate Id of new order
}
}
我喜歡這種做法是要添加將實例排序到OrderRepository。這很有道理。但是,訂單實例沒有Id,並且在存儲庫的使用者範圍內,對於我而言訂單沒有Id是沒有意義的。我可以將OrderRequest定義爲一個訂單實例並將其添加到存儲庫,但感覺就像從橙色中獲取蘋果,然後將其添加到橙子列表中。
另外,我也看到了這種做法:
class OrderRepository
{
Order AddOrder(Customer customer)
// It might be better to call this CreateOrder
{
// Insert record into db and return a new instance of Order
}
}
我喜歡這種方法是一種順序是不確定沒有ID。存儲庫可以創建數據庫記錄並在創建和返回訂單實例之前收集所有必填字段。這裏有什麼味道是事實上,你從來沒有實際上將一個訂單的實例添加到存儲庫。
無論哪種方式的作品,所以我的問題是:我必須生活在這兩種解釋之一,還是有最佳做法來建模插入?
我發現這個答案是相似的,但對於價值對象: how should i add an object into a collection maintained by aggregate root。當涉及一個值對象時,不會有任何混淆,但是我的問題涉及到一個來自外部源的實體(自動生成的數據庫ID)。
我認爲沒有身份證的訂單根本不是訂單實體,這是您的第一個初步想法來自哪裏。爲了解決這個問題,你必須記住你的對象的狀態。將'狀態'看作是一段時間的停頓。即,網頁請求。在創建一個訂單的過程中,是的,它最初沒有一個Id,但你尚未完成它的狀態 - 你將它添加到存儲庫中,從而完成Order()的持久化狀態,現在是完成。 – eduncan911 2010-01-19 21:04:40
我並不同意你的觀點,但是如果你聲稱一個沒有和Id的訂單是一個短暫停頓的實體,在這個暫停期間它將沒有可辨別的身份。我認爲,至少在語義上,這是與實體定義的矛盾。 – 2010-01-19 21:17:26
身份不像你想象的那樣枯燥無味。根據我的信念,我們的身份是我們獨特的靈魂,從我們的概念出現。但對政府來說,我們的身份可以通過多種方式建立:出生證明,護照等等。有一個時間點兒童沒有政府的官方身份,但政府仍然認爲它是一個實體,儘管需要身份證明。把訂單想象成一個寶貴的小寶貝,並將其作爲政府的存儲庫(無論如何,整個系統都更加用戶友好!):) – tuespetre 2014-05-23 04:14:18