如何在DDD中从root创建此组件?

时间:2009-10-20 00:42:38

标签: domain-driven-design

我有一个关于如何使用DDD解决以下场景的问题。

我有2个实体PersonEmail,有一对多的关系。一个人可以拥有零个或多个电子邮件地址。

PersonEmail的聚合根,它是一个组件。

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

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

我在系统中有2个要求:

  1. 用户可以向人员发送添加新电子邮件的请求

  2. 用户可以临时创建电子邮件列表,可能会也可能不会将其添加给人。

  3. 在DDD中有3种方法有意义吗?或者是否有更好的方法来满足我的要求。

    1. 要从聚会创建电子邮件,但不将其添加到电子邮件列表中(请参阅下面的createEmail())。

    2. 使用单独的方法将电子邮件添加到列表中(请参阅下面的setEmail())。

    3. 为个人创建电子邮件并将其添加到电子邮件列表的方法(请参阅下面的addEmail())。


    4. 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);
          }   
      }
      

2 个答案:

答案 0 :(得分: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; }
     }
}

答案 1 :(得分: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);
  }
}