- 给定一个
Employee
实体和一堆个人/组织相关信息(例如婚姻状况、 child 信息、部门,位置)。是所有个人信息都表示为组件/值对象,还是将信息驻留在实体类中更好? 是否会使用一个人(可以收集所有个人信息)值对象作为
员工
的基础对象(组合
) > 实体是一个糟糕的设计选择?还有这种行为如何正确建模(根据
DDD
):如果员工有 child ,那么它应该有出生证明(具有相应的数据:姓名、问题日期等)
或如果员工已婚则应有结婚证(有相应数据:配偶姓名等)
?
对于 child 案例,我决定使用 ChildrenInformation
值对象:
public class ChildrenInformation
{
public String BirthCertificateCode { get;set; }
public DateTime BirthCertificateIssueDate { get;set; }
public ChildName { get; set; }
public ChildMiddleName { get; set; }
public ChildLastName { get; set; }
public DateTime ChildBirthday{ get; set; }
}
public class Employee : AbstractEntity<Employee>, IAggregateRoot
{
public ISet<ChildrenInformation> ChildrenInformation { get; set; }
/* other things ...*/
}
从设计角度看会不会错?
编辑
另一个想法是共享Certificate
类。
[Serializable]
public class Certificate
{
public String Code { get; set; }
public String Number { get; set; }
public String RegistreeName { get; set; }
public Address RegistreeAddress { get; set; }
public String RegistreeDateOfBirth { get; set; }
public String RegistredAt { get; set; }
public DateTime DateRegistred { get; set; }
}
[Serializable]
public class Employee : AbstractEntity<Employee>, IAggregateRoot
{
public Certificate Passport { get; set; }
public Certificate MarriageCertificate { get; set; }
public ISet<Certificate> ChildrenBirthCertificates { get; set; }
}
谢谢!
最佳答案
我会这样建模:
public class Person
{
public String Name { get; set; }
public String MiddleName { get; set; }
public String LastName { get; set; }
public DateTime Birthday { get; set; }
public BirthCertificate BirthCertificate { get;set; }
public MarriageCertificate MarriageCertificate { get;set; }
// ...etc...
}
public class Certificate
{
public String Code { get;set; }
public DateTime IssueDate { get;set; }
// ...etc...
}
public class BirthCertificate: Certificate
{
public DateTime BirthDate { get;set; }
// ...etc...
}
public class MarriageCertificate: Certificate
{
public String SpouseName { get;set; } // or Spouse could also be a person
// ...etc...
}
public class Employee
{
public ISet<Person> Children { get; }
// ...etc...
}
几点:
- 注意 ?用法,这意味着证书是可选的。
- 证书应有自己的类型。如果您拥有多个以相同前缀开头的属性,大多数情况下,这意味着您可以根据它们定义一个对象。我还创建了一个基础 Certificate 类,因为它们可能共享一些共同的属性和行为。
- Children 是 Person 对象的集合。
- 如果您愿意,配偶也可以是个人(该属性(property)将被命名为配偶)。
- 我不在属性名称中重复声明类型名称:Name 而不是 PersonName
关于c# - 适当的领域模型设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8836755/