在域驱动设计中为模型属性设置默认值的最佳实践?

时间:2013-01-31 00:43:12

标签: entity-framework domain-driven-design default models

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

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

public class Person {
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
    public bool IsAlive { get; set; }
    public List Limbs { get; set; }

    public static Person GetNew() {
        return new Person() { 
            IsAlive = true,
            Limbs = new List() { RightArm, LeftArm, RightLeg, LeftLeg }
        }
    }
}

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

Crappy解决方案将作为参数传递:

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

另外还有一些更好的方法来设置简单和简单的默认值。复杂的模型属性?

2 个答案:

答案 0 :(得分:4)

这是factory pattern in DDD的一个实例。它可以是专用类,如PersonFactory,也可以是静态方法,如示例所示。我更喜欢静态方法,因为我认为不需要创建一个全新的类。

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

答案 1 :(得分:0)

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