域驱动设计中的动态属性集

时间:2012-09-03 08:10:53

标签: domain-driven-design modeling

通过搜索后,我无法找到任何可以回答此问题的问题,在我看来是相当常见的设计问题。

给定域对象:

public class Item {
    private Long itemSN;
    private String name;

    methods, etc...
}

我们需要存储描述项目的特定String属性集。它可以是重量,颜色,尺寸等。系统必须灵活并且能够保持可更改的列表属性。它需要存储允许的属性名称,并且最好强制执行其中的一些。

我尝试了几种方法,但所有Item对象共享的常见约束概念都不适合任何标准域模型。

所以我开始考虑将约束作为一种配置形式。每个Item都有自己的属性(在简单的String Map中),另一方面,约束是所有Items的通用配置。所以下一个困境出现了...如何在不模糊领域模型的情况下表达它?

很容易引入额外的应用程序层对象来存储约束,但是“允许/需要的属性”是商业事务,我们需要允许域用户(某种类型的管理者)来改变它,所以它的绘制感觉非常可怕逻辑远离域层。

欢迎任何建议。

修改1。 经过大量的头脑风暴,我设法为给定的情况创建有效的对象模型。从一开始就不可能用常见的约束来封装属性,但最新的域外实现给了我一个想法:

public class Item {
    private Long itemSN;
    private String name;
    private List<Property> properties;
}

问题的核心在这里解决了:

public class Property {
    private Long propertyId;
    private String propertyValue;
    private Constraint constraint;
}

public class Constraint {
    private String name;
    private Boolean required;
    private List<String> allowedValues;
}

因此,每个属性都有其值和约束对象,它指定名称,允许值和所需状态。这种约束对象可以由许多属性共享,并且任何这些属性都可以具有其自己的值。 它为数据库映射增加了一些复杂性,并且会影响性​​能,但它也会将所有域逻辑保留在域对象中。

欢迎任何改进,建议和意见。

1 个答案:

答案 0 :(得分:1)

使用注释可以非常合理地解决这个问题。注释允许您(编码人员)通过简单地使用约束注释属性来继续使用语言来使用属性,同时仍然可以在没有注释的情况下将相同的约束应用于用户定义的字段。

JSR-349是应用此类约束的Java标准。 Hibernate validator是一个众所周知的实现。