我有一个关于如何使用DDD解决以下场景的问题。
我有2个实体Person
和Email
,有一对多的关系。一个人可以拥有零个或多个电子邮件地址。
Person
是Email
的聚合根,它是一个组件。
class Person{
Set<Email> emails = new HashSet<Email>
}
Class Email {
String value;
Email(String value){
}
}
我在系统中有2个要求:
用户可以向人员发送添加新电子邮件的请求
用户可以临时创建电子邮件列表,可能会也可能不会将其添加给人。
在DDD中有3种方法有意义吗?或者是否有更好的方法来满足我的要求。
要从聚会创建电子邮件,但不将其添加到电子邮件列表中(请参阅下面的createEmail()
)。
使用单独的方法将电子邮件添加到列表中(请参阅下面的setEmail()
)。
为个人创建电子邮件并将其添加到电子邮件列表的方法(请参阅下面的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 :(得分: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);
}
}