7

在 DDD 中为新实体设置默认属性的最佳方法是什么?此外,为复杂属性(例如集合)设置默认状态的最佳方法是什么?

我的感觉是默认值应该在模型本身中,因为它们是一种业务规则(“默认情况下,我们希望 X 是 Y 和 Z”),并且域代表业务。使用这种方法,模型本身的静态“GetNew()”方法可能会起作用:

公共类人{
    公共字符串名称 { 获取;放; }
    公共日期时间 DateOfBirth { 得到;放; }
    公共布尔 IsAlive { 获取;放; }
    公共列表肢体{得到; 放; }

    公共静态人GetNew(){
        返回新人(){
            IsAlive = 真,
            四肢 = new List() { RightArm, LeftArm, RightLeg, LeftLeg }
        }
    }
}

不幸的是,在我们的例子中,我们需要将集合属性设置为另一个列表的所有成员,并且由于该模型与其 Repository/DbContext 分离,因此无法加载所有成员。

糟糕的解决方案是作为参数传递:

public static Person GetNew(List<Limb> allLimbs) {
    return new Person() { 
        IsAlive = true,
        Limbs = allLimbs
    }
}

或者,是否有更好的方法为简单和复杂的模型属性设置默认值?

4

2 回答 2

4

这是DDD 中工厂模式的一个实例。它可以是专用类,例如PersonFactory,也可以是静态方法,例如您的示例。我更喜欢静态方法,因为我认为没有必要创建一个全新的类。

至于初始化集合,GetNew我会采用以集合为参数的方法。它陈述了一个重要的约束——要创建一个新的人实体,您需要该集合。集合实例将由托管需要它的特定用例的应用程序服务提供。更一般地,默认值可以存储在数据库中,在这种情况下,应用程序服务将调用存储库以获得所需的值。

于 2013-01-31T01:05:15.860 回答
0

查看 Joshua Bloch 的Effective Java(第二版)中的静态构建器。在那里,您有一个静态构建器类,并且您在构造之前链接调用以设置属性,因此它解决了具有接受大量参数的构造器或必须在每个属性上放置设置器的问题(在这种情况下,您实际上有结构)。

于 2013-01-31T00:56:50.003 回答