我有一个应该作为实体类的类(如在DDD中)。它基本上是这样的:
public class Page
{
protected String Name;
protected String Description;
protected Dictionary<int, IField> Fields = new Dictionary<int, IField>();
protected Page SetName(String name)
{
this.Name = name;
return this;
}
protected Page SetDescription(String description)
{
this.Description = description;
return this;
}
public Page AddField(IField field)
{
this.Fields.add(xxx, Field); //xxx = just some id
return this;
}
}
现在我的问题是,这是一个有效的实体类吗?
我需要保持方法链接,所以请不要过多详细说明(即使你认为这是错误的)。
我主要担心的是,实体类是否可以包含getter和setter等方法?特别是像AddField
?
AddField
方法采用IField
类型的对象。我将它存储在Page
类的字典中。那是一个聚合,对吗?
这不会改变实体的状态,使其不是真正的实体类吗?
或者这样就好了吗?
答案 0 :(得分:4)
我主要担心的是,实体类是否可以包含方法,例如 吸气鬼和二传手?特别是像AddField这样的方法?
实体可以包含getter,setter,adders,behavior和业务规则(recommended)...基本上你想要的任何内容。
AddField方法接受IField类型的对象。我存储了那个 在Page类中的字典中。那是一个聚合,然后, 正确?
不,它可能是聚合 root ,但不一定。这取决于您的上下文以及如何设计聚合。见http://dddcommunity.org/library/vernon_2011
这不会改变实体的状态,使其不是真实的 实体类?
这是改变状态的实体的本质,这就是为什么我们给它们ID来跟踪变化。另一方面,值对象可以变为不可变,因为它们的身份无关紧要,大多数情况下你不修改值对象而只是创建一个新对象。
如果您想要使用DDD路线,我建议您阅读blue book或summary以便对该方法有基本的了解。 DDD有自己的原则和设计模式 - 如果你不采用整个范式或者至少得到它背后的意图,那么它们中的一些并不总是有意义的。
答案 1 :(得分:1)
我觉得你的班级看起来很好,你并没有像大多数人那样犯这样的男生错误,在这种错误中你有一个字典的吸气剂(所以你正确地封装和隐藏了字典)。
我假设你通过名称识别一个Page,这样就成了一个实体所需的id。
关于什么是聚合。 Page类看起来像聚合根,因为您通过Page类控制对子项(IField)的访问。
我不能说更多......看起来很好。