问题的较短版本:“是否可以拥有一个超类,有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 不能是实体。
但是让一个实体和一个价值对象共享同一个超类(都是团队),有点奇怪。也许这个域名模型有问题。
需要意见。
由于
答案 0 :(得分:0)
听起来像ExecutionTeam可能更好地建模为接口ICanExecuteTasks
。这对你有用吗?它将消除你正在努力解决的问题..
关于你的简短问题,如果ExecutionTeam
确实是Team
的派生类,(继承自团队并代表“IsA”重新关联,那么答案是否定的,他们不能是不同类型因为当然,每个ExecutionTeam都是一个团队,thgere只有一件事,它同时是一个Team
和一个ExecutionTeam
......它不能同时是一个实体Type和一个值同时输入。
但是你设计类的方式,因为你有结构化的东西,ExcecutionTeam
不是派生类,它是DefaultTeam
的属性。这意味着他们有“HasA”关系。这意味着它们是不同的,共存的对象,其中一个可以是实体,其中一个可以是值类型。但我的直觉告诉我,这不是你真实领域模型的准确镜像......
答案 1 :(得分:0)
什么使DefaultTeam成为值对象而不是实体? DefaultTeam也不是一个实体吗?
话虽如此,这里有一些评论:
为什么需要DefaultTeam的特殊课程? DefaultTeam不能只是具有某些指定值的ExecutionTeam吗?
DefaultTeam应该是与应用程序域关联的Team的实例。例如,您可能拥有一个通常用于解决Project XYZ问题的特定团队。
您可能应该将“PreviousTeam”作为Team和ExecutionTeam类的属性,而不是将“DefaultTeam”列为ExecutionTeam的属性。 如果团队再次发生变化,这将更加普遍。
由于任务是域的重要组成部分并且已分配给团队,因此它应该是团队的财产。
“助手”似乎不适合团队成员。为什么不将它们命名为“会员”或“团队成员”?
“Master”可能不是PC,除非您在Dilbert工作或处理数据库:)您可能希望将其更改为“Supervisor”或“Manager”。
“代码”在您的应用程序上下文中可能是一个坏名称,因为它可能很容易与编程代码混淆。您可能希望改为使用“Id”或“TeamId”。