Domain driven design 如何从DDD中的根目录创建此组件?

Domain driven design 如何从DDD中的根目录创建此组件?,domain-driven-design,Domain Driven Design,我有一个关于如何使用DDD解决以下场景的问题 我有两个具有一对多关系的实体Person和Email。一个人可以有零个或多个电子邮件地址 Person是作为组件的电子邮件的聚合根 class Person{ Set<Email> emails = new HashSet<Email> } Class Email { String value; Email(String value){ } } 我个人认为,一个名为setEmail()的方法

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

我有两个具有一对多关系的实体
Person
Email
。一个人可以有零个或多个电子邮件地址

Person
是作为组件的
电子邮件的聚合根

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

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

我个人认为,一个名为setEmail()的方法可能会向此人添加一封特殊的电子邮件。例如,一个人有一个主电子邮件地址。我认为最好用电子邮件来澄清这一点

此外,我会使用工厂创建一个临时电子邮件。在现实世界中创建电子邮件地址不是一个人的责任。在我的想象中,一个好的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);
  }
}
公共类人物{
Set emails=newhashset
公用邮件(字符串值){
Email Email=EmailFactory.createEmail(值);
电子邮件。添加(电子邮件);
}
公开邮件(电子邮件){
电子邮件。添加(电子邮件);
}
}
公共类电子邮件{…}
公共类电子邮件工厂{
公共静态电子邮件createEmail(字符串值){
返回新电子邮件(值);
}
}

就我个人而言,我会觉得它有所不同:

我只会将“人”视为一个实体。电子邮件是一种值类型(组件),而不是实体,因为它没有标识

然后,我会将个人的电子邮件地址公开为个人实体的只读集合

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; }
     }
}
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; }
     }
}