【发布时间】:2021-11-07 15:45:35
【问题描述】:
我开始学习领域驱动设计,在继承方面需要一些指导。
我有以下代表员工的类:
public class Employee
{
public Guid EmployeeID { get; }
public String Firstname { get; }
public String Lastname { get; }
// Constructor
private Employee(Guid employeeID, String firstname, String lastname)
{
EmployeeID = employeeID;
Firstname = firstname;
Lastname = lastname;
}
// Factory
public static Create(Guid employeeID, String firstname, String lastname)
{
return new Employee(employeeID, firstname, lastname)
}
}
问题
员工也可以是公司的所有者,我的问题是如何构建CompanyOwner类?推荐的实现方式是什么?
选项 1:继承 Employee-class
公司老板是员工,所以感觉一种方法可以是继承员工。
但是,这意味着 EmployeeID、Firstname 和 Lastname 属性必须更改为在 Employee-class 中具有受保护的 setter。在 DDD 中可以吗?
public class CompanyOwner : Employee
{
// ID for the owner (primary key in database)
public Guid CompanyOwnerID { get; }
// Constructor
private CompanyOwner(Guid companyOwnerID, Guid employeeID, String firstName, String lastName)
{
CompanyOwnerID = companyOwnerID;
EmployeeID = employeeID;
Firstname = firstname;
Lastname = lastname;
}
// Factory
public static CompanyOwner Create(Guid companyOwnerID, Guid employeeID, String firstname, String lastname)
{
return new CompanyOwner(companyOwnerID, employeeID, firstname, lastname);
}
}
选项 2:员工信息的单独属性
通过这样做,可以调用 Employee-factory 方法。但是我必须通过 MyOwner.EmployeeInfo.Firstname 访问它,只使用 MyOwner.Firstname 会更干净
public class CompanyOwner
{
// Unique ID for the owner (primary key)
public Guid CompanyOwnerID { get; }
// Employee info
public Employee EmployeeInfo { get; }
// Constructor
private CompanyOwner(Guid companyOwnerID, Guid employeeID, String firstName, String lastName)
{
CompanyOwnerID = companyOwnerID;
// Calling factory-method of Employee-class to set employee-info
EmployeeInfo = Employee.Create(employeeID, firstName, lastName);
}
// Factory
public static CompanyOwner Create(Guid companyOwnerID, Guid employeeID, String firstname, String lastname)
{
return new CompanyOwner(companyOwnerID, employeeID, firstname, lastname);
}
}
选项 3:跳过 CompanyOwner-class 并在 Employee-class 中使用 IsOwner-property
在我的情况下,这实际上不是一个选项,因为员工可以是多家公司的所有者,而且 CompanyOwnerID(所有者的主键)不适合 Employee 类 p>
public class Employee
{
public Guid EmployeeID { get; }
public String Firstname { get; }
public String Lastname { get; }
public Boolean IsOwner { get; }
// Constructor
private Employee(Guid employeeID, String firstname, String lastname, Boolean isOwner)
{
EmployeeID = employeeID;
Firstname = firstname;
Lastname = lastname;
IsOwner = isOwner;
}
// Factory
public static Create(Guid employeeID, String firstname, String lastname, Boolean isOwner)
{
return new Employee(employeeID, firstname, lastname, isOwner)
}
}
【问题讨论】:
标签: inheritance domain-driven-design domain-model