【问题标题】:Best practice for setting default values for model properties in Domain Driven Design?在领域驱动设计中为模型属性设置默认值的最佳实践?
【发布时间】:2013-01-31 00:43:12
【问题描述】:

在 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
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 eulerfx,我们可能会采用这种方法来获得一些外部验证。我也看过工厂课程,一直认为它们是矫枉过正的。
    • 为了记录——我们实际上最终在存储库中实现了这个作为 repository.GetNewPerson() 方法。这样它就在域中(正确的位置),并且它可以访问其他实体和列表,因此可以相应地填充默认值。我认为这是您建议的实现工厂模式的最佳方法。
    【解决方案2】:

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

    【讨论】:

    • OP 正在使用 C#,其中以大写字母开头的方法名称是一种普遍的约定。
    • 哈哈,好的。以为是 Java。
    • 这看起来像 C#,而不是 Java,所以方法名应该大写。
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2020-05-05
    • 1970-01-01
    • 2014-09-22
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多