2012-08-30 64 views
1

我在一些對象中需要TimePeriod(AM,PM,NIGHT等)引用。例如。 ScheduledMeeting,ActualMeeting。DDD全局值對象

雖然TimePeriod在數據庫中有一個ID,但它絕對不是一個實體,因爲它不會改變,並且所有對象的'AM'期間都是相同的。

我的困難在於知道如何從數據庫中檢索這個值對象。由於不同的對象可以引用它,因此它不應該是其任何存儲庫方法的一部分,但同時它不應該是真的有自己的存儲庫,因爲它不是根。

那麼你會如何建議從數據庫中獲取?

謝謝。

UPDATE

我已經與eulerfx的答案,因爲他解釋說,時間可以從DB通過資源庫仍然會返回,但我真的不喜歡,你會被設置了這個想法用於多個全局值對象的多個小型存儲庫。這個區域對我來說仍然有點灰。

+0

如果它永不改變,爲什麼不硬編碼表作爲全局查找? – Oded

+0

因此,如果我有多於一個這種類型的查找(例如會議長度),但在數據庫中有不同的'ID'類型,我是否只需要一個全局查詢服務,其中兩種方法是'TimePeriod GetTimePeriods'和'MeetingLength GetMeetingLengths'? – user676767

+0

可能 - 這絕對屬於「服務」保護範圍之內,但我不知道這樣的域特定方法是否合適。 – Oded

回答

1

由於TimePeriod是一個值對象,當其他對象引用它時,它們引用值本身而不是ID。使時間段對象不可變,以便一旦對象引用一段時間,它就知道它不會改變。時間段值可以存儲在數據庫表中,然後表格記錄具有ID,但是這些不需要在代碼中表示。例如,如果您希望提供一個顯示可用時間段列表的UI,那麼您可以擁有一個用於檢索時間段的簡單存儲庫。版本庫不總是總是必須只返回聚合。如果時間段本質上是高度靜態的,那麼你可以考慮在內存中緩存,或者甚至有一個包含所有可用時間段的靜態類。

+1

「存儲庫並不總是必須只返回聚合。」這不是反對埃文的概念嗎? –

+1

在他關於版本庫的一節中,他聲明一個版本庫也可以返回彙總計算等。我認爲版本庫可以有多種含義,具體取決於視角。有些人認爲它們只與聚合有關,有些則認爲它們是數據源的更一般的抽象。 – eulerfx

1

雖然TimePeriod在數據庫中有一個ID,但它絕對不是一個實體,因爲它不會改變。

只要對象具有定義良好的生命週期,即使其內容不變,它也可以是實體。要問的問題是「將動態創建和刪除TimePeriods嗎?」

  • 是嗎?那麼TimePeriod應該是一個擁有自己存儲庫的實體。這是Eric Evans在他的DDD書中描述的knowledge level的一個例子。

  • 不是嗎?那麼你不需要數據庫,只需靜態定義TimePeriods即可。