正确的领域模型设计

本文关键字:领域模型 | 更新日期: 2023-09-27 18:20:11

  1. 给定一个Employee实体和一堆与个人/组织相关的信息(如婚姻状况子女信息部门职位)。是将所有个人信息表示为组件/值对象,还是将信息驻留在实体类中更好
  2. 使用一个人(可以收集所有个人信息)值对象作为Employee实体的底层对象(composition)会是一个糟糕的设计选择吗?

  3. 此外,这种行为将如何正确建模(根据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实体)。

请注意,组合的设计概念与值类型的CLR概念无关。复合只是意味着所拥有对象的寿命与所有者的寿命相绑定。这也可以通过引用类型来实现,例如,如果所有者是唯一一个引用所属对象的人。

也就是说,Simon的解决方案很好。