正确的领域模型设计
本文关键字:领域模型 | 更新日期: 2023-09-27 18:20:11
- 给定一个
Employee
实体和一堆与个人/组织相关的信息(如婚姻状况、子女信息,部门和职位)。是将所有个人信息表示为组件/值对象,还是将信息驻留在实体类中更好 -
使用一个人(可以收集所有个人信息)值对象作为
Employee
实体的底层对象(composition
)会是一个糟糕的设计选择吗? -
此外,这种行为将如何正确建模(根据
DDD
):If employee has kids then it should have a birth certificate (with corresponding data: name, issue date, etc)
或If employee is married then it should have marriage certificate (with corresponding data: spouse name, etc)
?
对于一个儿童案例,我决定使用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对象的集合
- 配偶也可以是一个人,如果你愿意的话(财产将被命名为配偶)
- 我不重复在属性名称中声明类型名称:name而不是PersonName
给定一个员工实体和一堆与个人/组织相关的信息(如婚姻状况、子女信息、部门、职位)。是将所有个人信息表示为组件/值对象,还是将信息驻留在实体类中更好?
我会把所有给定的例子作为雇员实体中的属性。我认为把它们作为价值对象没有任何好处?
使用一个人(可以收集所有个人信息)值对象作为Employee实体的底层对象(组合)会是一个糟糕的设计选择吗?
这更像是一个领域问题。对于彼此不相关的不同模型,我通常不使用继承,而是使用Customer和Employee(而不是Person实体)。
也就是说,Simon的解决方案很好。