域驱动设计 - 实体VO和类层次结构

时间:2010-01-03 22:08:58

标签: domain-driven-design class-hierarchy

问题的较短版本:“是否可以拥有一个超类,有2个子类,一个是实体,另一个是值对象?”

更长的版本: T有一个团队超类。 团队包含主人帮助代码。 然后我有 DefaultTeam 团队的子类,这是一个具有唯一**的实体**代码****具有其域名标识。 然后我有** ExecutionTeam ,它是团队的子类,并且有一个额外的属性 OriginalTeam

public abstract class Team{

    public string Code{ get; protected set; }

    public Worker Master{ get; protected set; }

    public IList<Worker > Helpers { get; protected set; }
    ...

}

public class DefaultTeam: Team
{
}

public class ExecutionTeam : Team
{

    public virtual string Code { get { return OriginalTeam.Code; } }

    public virtual DefaultTeam OriginalTeam { get; private set; }

   ...

 }

ExecutionTeam 是执行任务的团队。 当需要执行任务时,我们会选择 DefaultTeam 来执行它。 但我们可以从 DefaultTeam 更改助手(主人永远不会更改)。

执行任务的团队是 DefaultTeam OriginalTeam )的变体,但是选择了帮助那个任务。

ExecutionTeam 相同的代码具有OriginalTeam 。所以 ExecutionTeam没有唯一身份。 如果同一 DefaultTeam 有10个任务执行,则会有10个 ExecutionTeams 具有相同的代码(具有相同的 OriginalTeam )。所以 ExecutionTeam 不能是实体。

但是让一个实体和一个价值对象共享同一个超类(都是团队),有点奇怪。也许这个域名模型有问题。

需要意见。

由于

2 个答案:

答案 0 :(得分:0)

听起来像ExecutionTeam可能更好地建模为接口ICanExecuteTasks。这对你有用吗?它将消除你正在努力解决的问题..

关于你的简短问题,如果ExecutionTeam确实是Team的派生类,(继承自团队并代表“IsA”重新关联,那么答案是否定的,他们不能是不同类型因为当然,每个ExecutionTeam都是一个团队,thgere只有一件事,它同时是一个Team和一个ExecutionTeam ......它不能同时是一个实体Type和一个值同时输入。

但是你设计类的方式,因为你有结构化的东西,ExcecutionTeam不是派生类,它是DefaultTeam的属性。这意味着他们有“HasA”关系。这意味着它们是不同的,共存的对象,其中一个可以是实体,其中一个可以是值类型。但我的直觉告诉我,这不是你真实领域模型的准确镜像......

答案 1 :(得分:0)

什么使DefaultTeam成为值对象而不是实体? DefaultTeam也不是一个实体吗?

话虽如此,这里有一些评论:

  1. 为什么需要DefaultTeam的特殊课程? DefaultTeam不能只是具有某些指定值的ExecutionTeam吗?

  2. DefaultTeam应该是与应用程序域关联的Team的实例。例如,您可能拥有一个通常用于解决Project XYZ问题的特定团队。

  3. 您可能应该将“PreviousTeam”作为Team和ExecutionTeam类的属性,而不是将“DefaultTeam”列为ExecutionTeam的属性。 如果团队再次发生变化,这将更加普遍。

  4. 由于任务是域的重要组成部分并且已分配给团队,因此它应该是团队的财产。

  5. “助手”似乎不适合团队成员。为什么不将它们命名为“会员”或“团队成员”?

  6. “Master”可能不是PC,除非您在Dilbert工作或处理数据库:)您可能希望将其更改为“Supervisor”或“Manager”。

  7. “代码”在您的应用程序上下文中可能是一个坏名称,因为它可能很容易与编程代码混淆。您可能希望改为使用“Id”或“TeamId”。