2017-02-15 81 views
1

我对DDD非常陌生,并且一如既往,当您将自己的头围绕在有趣的概念中时,您将不可避免地触及到某个点或某种情况,这会让您不确定如何随之产生的结果学会应该面对某些问题应用。DDD - 从实体中派生价值对象

假设您有两个关于用户的不同日期:DateOfBirthDateOfRegistration。将它们分别作为两个不同的值来实现是非常有意义的。这很简单,很棒。

现在,我们假设在一个应用程序Users可以参与Projects。一个项目可以有多个members和一个创建(拥有)它的用户。

因此ProjectMembersProjectOwner都是Users

有两种方式Project来实现这个功能:

答:强类型 - 创建类ProjectMemberProjectOwner然后“行为”的值对象。要么让他们作为包装工作,要么甚至扩展User类。

B:懒惰的方法 - 根据期望的行为/期望简单地命名方法和参数,并推动User周围的对象。

在我看来,以下B意味着滴DDD的原则。

以下A会导致数十个班级,其中许多班级不会做任何事情,但会强制执行类型安全。

我很困惑,因为与简单的日期相比,用户是实体甚至聚合根,同时更复杂。

是A,B还是有第三种选择?

回答

2

以下A会导致数十个班级,其中许多班级不会做任何事情,但会强制执行类型安全。

不,他们还记录了您在域模型中发现的区别;你可能还不知道这些区别是如何影响模型的行为的,但是你已经掌握了占位符和正确的语言(假设你的名字正在绘制无处不在的语言),所以你的领域模型更接近对齐与业务。

那不是什么。

我很困惑,因为与简单的日期相比,用户是实体甚至聚合根,同时也更复杂。

因此,有一点需要记住 - 您不会像习惯一样,从保护他们的聚合体之外引用实体。所以ProjectOwnerId而不是ProjectOwner

对于类型不做什么有趣的事(标识尤其趋于是没有做太多,除了比其他标识符不透明的事),你 可能会有点语法使用相同类型确保型糖安全。

例如Identifier<T>给你Identifier<ProjectMember>Identifier<ProjectOwner>含蓄,而不是要求你产生不同的实现方式为标识符

的每个拼写