[英]Is there a proper way to use a Repository class in a Domain Model class in Domain Driven Design?
[英]Proper domain model design
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...
}
一些要点:
给定员工实体和一堆个人/组织相关信息(如婚姻状况,子女信息,部门,职位)。 是否所有个人信息都表示为组件/值对象,或者信息更好地驻留在实体类中?
我会将所有给定的示例作为属性放在员工实体中。 将它们作为价值对象,我认为没有任何好处?
使用一个人(可以收集所有个人信息)值对象作为Employee实体的底层对象(组合)会是一个糟糕的设计选择吗?
这更像是一个域名问题。 我通常不使用继承,但使用Customer和Employee(而不是Person实体)作为彼此不相关的不同模型。
请注意,组合的设计概念与值类型的CLR概念无关。 组合只意味着拥有对象的生命周期与所有者的生命周期相关联。 这也可以通过引用类型来实现,例如,如果所有者是唯一具有对所拥有对象的引用的所有者。
那就是说,Simon的解决方案很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.