2010-11-18 71 views
0

標題neds的工作,但我可以想到的最好的解釋是一個例子。DDD:與其他許多其他對象相關的對象,還是僅與另一個對象相關的對象?

假設您有一個「註釋」對象,表示可以附加到系統中其他類型對象的註釋,例如Account,Appointment或其他。筆記只有日期和筆記的內容,並且只能應用於另一個對象的一個​​實例。

因此,這是更好的:

注意,可以有它不適用於(注意必須說明是爲的預約的引用類型的空引用的
  • 一種類型,但空的帳戶/其他對象在系統中它不是)
  • 重複相同的邏輯,但避免具有無關筆記引用的多筆記類型(AppointmentNote,AccountNote)。

請記住,這些是持久性類,我不希望技術上由於具有子類註釋類型而使事情複雜化。在這種情況下,我希望保持域名儘可能平坦。

回答

-1

爲什麼不只是其他對象引用的單個Note類呢?約會,帳戶等只是一個Note對象的通用列表。

+0

爲了讓持久對象發生這種情況,Note將爲n-1個字段(其中n是可以在其上註釋的對象的數量)具有空fkeys。這是我用第一種方法解決問題的關鍵。多重性是'預約/賬戶1 - *注' – 2010-11-18 18:36:17

+0

@SnOrfus:也許我沒有看到關於你的ORM的東西(或者我可能只是休息一天)。但至少從領域的角度來看,讓對象帶着適用於他們的筆記似乎是有意義的。除非有一種情況,一個人從一張紙條開始,需要找到其父母?我認爲筆記會是第一流的父對象的二等加載項。爲什麼筆記需要參考他們的父母? – David 2010-11-18 18:46:19

2

因此,這是更好的:

  • 一個需要注意的是可以有它不適用於(注意必須說明是爲的預約的引用類型的空引用,但空的類型對於系統中不存在的帳戶/其他對象)
  • 複製相同邏輯但避免具有不相關注釋引用的多個註釋類型(AppointmentNote,AccountNote)。

也沒有。另外,我不清楚我們是在談論你的對象還是你的表格。

有一種類型的註釋。它不應該引用它所涉及的對象。

public class Note 
{ 
    public DateTime CreatedAt { get; set; } 
    public string Content { get; set; } 
} 

public class Account 
{ 
    public ICollection<Notes> Notes { get; } 
} 

public class Appointment 
{ 
    public ICollection<Notes> Notes { get; } 
} 

然後有一對夫婦的方式來鋪陳數據庫表,這兩個應該很容易地與任何ORM支持(雖然不一定容易,以支持一個不真正-AN-ORM,但-half-look-like-one,例如Linq2SQL或SubSonic,可爲每個數據庫表生成類的工具)。

首先DB佈局:

TABLE Notes 
(
    Id, 
    CreatedOn, 
    Content, 
    AccountId, 
    AppointmentId 
) 

那麼,如果n-1外鍵爲空。這是每級類型的平行式樣式,它被接受爲對某些子類無效且無意義的列。

方法二:

TABLE Notes 
(
    Id, 
    CreatedOn, 
    Content 
) 

TABLE AccountNotes 
(
    AccountId, 
    NoteId 
) 

TABLE AppointmentNotes 
(
    AppointmentId, 
    NoteId 
) 

,這將是更多的表,每級的佈局。沒有人說你實際上需要在代碼中使用子類註釋類型 - 但即使你這樣做了,爲了避免「打擊你的工具」,它並不意味着邏輯的重複 - 只需使用基本類型並將你的行爲放在那裏。

最後,你將不得不選擇。關於預約的說明與賬戶記錄本質上不同,你將不得不在某個層面上處理它。

+0

+1 - 您已經以更簡潔的方式正確地重申了我的難題。你說得對,我不得不選擇,我只是不確定你在鼓吹什麼。 – 2010-11-18 19:31:58

+0

好吧,你的意見和問題似乎是說你不想挑選。還有,關於你的對象模型或數據庫表的問題呢?如果對象,我只給了一個選項。如果表格是完全有效的。選擇一款適合您數據訪問工具的產品。我傾向於選擇每班級的表,但只是因爲所有額外的表和ID都可能成爲開發 - 調試周期的拖累。 – 2010-11-18 19:36:42

相關問題