2009-10-20 48 views
0

我有一個關於如何使用DDD解決以下情形的問題。如何從DDD中的根創建此組件?

我有2個實體PersonEmail與一對多的關係。一個人可以有零個或多個電子郵件地址。

Person是一個組合的Email的聚合根。

class Person{ 
    Set<Email> emails = new HashSet<Email> 
} 

Class Email { 
    String value; 
    Email(String value){ 
    } 
} 

我在系統2個要求:

  1. 用戶可以發送一個新的電子郵件添加到人

  2. 用戶可以暫時創建郵件列表的請求,並且可以或可能不會將它們添加到人。

有3種方法在DDD中有意義嗎?還是有更好的方法來滿足我上面的要求。

  1. 要從黨創建電子郵件,但不能將其添加到郵件列表(見下面createEmail())。

  2. 有一個單獨的方法只是添加電子郵件到列表(見下面的setEmail())。

  3. 一種爲個人創建電子郵件並將其添加到電子郵件列表(請參見下面的addEmail())的方法。


public Class Person{ 

    Set<Email> emails = new HashSet<Email> 
    public void addEmail(String value){ 
     Email email = createEmail(value); 
     emails.add(email); 
    } 

    public Email createEmail(String value){ 
     return new Email(value); 
    } 

    public void setEmail(Email email){ 
     emails.add(email); 
    } 
} 

回答

0

我個人認爲,一個叫setEmail()方法可能會增加一個特殊的電子郵件的人。例如,一個人有一個主要的電子郵件地址。我認爲重載addEmail來澄清這一點更好。

此外,我會用工廠創建一個臨時電子郵件。在現實世界中創建電子郵件地址不是一個人的責任。在我的想象中,一個好的DDD是一個現實的圖像,使它更容易使用,並以某種方式自我記錄。我的代碼看起來是這樣的:

public Class Person { 
    Set<Email> emails = new HashSet<Email> 

    public void addEmail(String value){ 
     Email email = EmailFactory.createEmail(value); 
     emails.add(email); 
    } 

    public void addEmail(Email email){ 
     emails.add(email); 
    } 
} 


public class Email {...} 


public class EmailFactory { 
    public static Email createEmail(String value) { 
    return new Email(value); 
    } 
} 
1

就個人而言,我會看到它的不同:

我只看到「人」作爲一個實體。電子郵件是一種價值類型(組件)而不是實體,因爲它沒有身份。

然後,我會將個人的電子郵件地址作爲Person實體的只讀集合公開。

public class Person 
{ 
    public void AddEmail(Email mail) {} 
    public void AddEmail(string mailAddress) {} 
    public void RemoveEmail(Email mail){} 
    public void RemoveEmail(string mailAddress){} 

    Email[] GetEmailAdresses() {}; 
} 

public struct Email 
{ 
    public Email(string address){} 

    public string Address 
    { 
     get {return _address; } 
    } 
}