c# - 适当的领域模型设计

标签 c# design-patterns domain-driven-design

  1. 给定一个 Employee 实体和一堆个人/组织相关信息(例如婚姻状况 child 信息部门位置)。是所有个人信息都表示为组件/值对象,还是将信息驻留在实体类中更好?
  2. 是否会使用一个人(可以收集所有个人信息)值对象作为员工的基础对象(组合) > 实体是一个糟糕的设计选择?

  3. 还有这种行为如何正确建模(根据 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/

相关文章:

c# - 使用 WCF 数据服务保存对象及其相关对象

c - 是否可以使用循环输出小键盘的模式?

java - 使用 Spring Boot 代替 DTO、Dao、Service 的设计模式?

design-patterns - 外观和抽象的出现模式

rest - 通过 DDD 应用程序从 REST api 返回域模型是否很好?

c# - ASP.NET MVC 3 显示模板问题

c# - 代表的封装问题?

architecture - 微服务架构 : Chatty services or data duplication

c# - 当前上下文中不存在名称 'con'

oop - 何时以及如何为 DDD 中的实体分配唯一 ID?