我不熟悉域驱动设计,最近我开始为项目创建域模型.我还没有决定使用ORM(虽然我可能会选择NHibernate)而且我目前正在努力确保我的Value Objects应该就是这样.
我有一些VO除了封装"喜欢"术语之外几乎没有任何行为,例如:
public class Referral {
public Case Case { get; set; } // this is the a reference to the aggregate root
public ReferralType ReferralType { get; set; } // this is an enum
public string ReferralTypeOther { get; set; }
} // etc, etc.
Run Code Online (Sandbox Code Playgroud)
这个特殊的类有一个参考"案例",这是两个级别,所以如果说我要访问推荐我可以去:case.social.referral(案例,社交和推荐都是所有类,有一个单一的社交在一个案例中,社交中有一个推荐).现在,当我输入它时我正在查看它,我认为我不需要推荐中的案例,因为它可以通过社交实体访问,对吗?
现在,毫无疑问,我认为这应该是一个VO,而我计划用来将其保存到数据库的方法是让NHibernate为它分配一个代理标识符(我仍然不太清楚) ,如果有人可以请详细说明它也会帮助我,因为我不知道代理标识符是否要求我已经在我的VO中有一个Id,或者它是否可以在没有一个的情况下运行)和/或受保护的Id属性不会在Referral类之外暴露(仅用于持久保存到DB).
现在转到我的标题问题:VO应该有一个集合,(在我的情况下是一个List)里面吗?我只能将其视为数据库中的一对多关系,但由于没有身份,因此使类成为实体似乎不够.以下是代码:
public class LivingSituation {
private IList<AdultAtHome> AdultsAtHome { get; set; }
public ResidingWith CurrentlyResidingWith { get; set } // this is an enum
} // etc, etc.
Run Code Online (Sandbox Code Playgroud)
这个类目前没有Id,而AdultsAtHome类只有内在类型(string,int).所以我不确定这是否应该是一个实体,或者它是否可以作为VO保留,我只需要使用自己的表和私有/受保护的Id字段将我的ORM配置为使用1:m关系,以便ORM可以持久保存到DB.
另外,我应该为每个课程使用规范化表格吗?我想我只需要为每个类使用一个表,当有可能将类的多个实例分配给实体或值对象时和/或有可能与这些对象中的某些对象具有集合1:m的关系.对于具有内部类型但具有嵌套类型的某些值对象使用单个表我没有问题我认为使用规范化表是有利的.对此有何建议? …
我有一个字典对象的包装类,我很好奇,如果__repr__在我的类中实现该方法时,首选的是另一个:
class MyClass(object):
def __init__(self):
self._obj = dict()
def __repr__(self):
return self._obj.__str__()
Run Code Online (Sandbox Code Playgroud)
要么
class MyClass(object):
def __init__(self):
self._obj = dict()
def __repr__(self):
return str(self._obj)
Run Code Online (Sandbox Code Playgroud)
第二次实施str()对我来说是对的.我只是想确保我没有遗漏任何东西.