1

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

更长的版本:T 有一个Team超类。团队MasterHelperCode。_ 然后我有DefaultTeamTeam的子类,它是一个具有唯一 **Code****的实体,具有其域标识。然后我有 **ExecutionTeam,它是Team的一个子类,并且有一个额外的属性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中更改Helpers(master 永远不会更改)。

执行任务的团队是DefaultTeam ( OriginalTeam ) 的变体,但具有仅为该任务选择的助手。

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

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

需要意见。

谢谢

4

2 回答 2

0

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

至于您的简短问题,如果ExecutionTeam确实是Team, 的派生类(从团队继承并代表“IsA”关系,那么答案是否定的,它们不能是不同的类型,因为当然,每个 ExecutionTeam 都是一个团队,thgere 是只有一件事,既是aTeam又是an ExecutionTeam……不能同时是实体类型和值类型。

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

于 2010-01-03T22:14:23.733 回答
0

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

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

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

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

  3. 与其将“DefaultTeam”列为 ExecutionTeam 的属性,不如将“PreviousTeam”列为 Team 和 ExecutionTeam 类的属性。这将更加普遍,以防团队再次发生变化。

  4. 由于 Task 是域的重要组成部分并分配给 Team,因此它应该是 Team 的属性。

  5. “帮手”似乎不适合团队成员。为什么不直接将他们命名为“成员”或“团队成员”?

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

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

于 2010-01-03T22:21:54.420 回答