Domain driven design 域驱动设计中的动态属性集

Domain driven design 域驱动设计中的动态属性集,domain-driven-design,modeling,Domain Driven Design,Modeling,经过搜索,我找不到任何能回答这个问题的问题,在我看来,这是一个相当普遍的设计问题 给定域对象: public class Item { private Long itemSN; private String name; methods, etc... } 我们需要存储描述项的特定字符串属性集。它可以是重量,颜色,大小等。系统必须是灵活的,能够持久的可变列表o属性。它需要存储允许的属性名称,最好强制执行其中的一些属性名称 我尝试了几种方法,但所有项对象共享的公共约束的概

经过搜索,我找不到任何能回答这个问题的问题,在我看来,这是一个相当普遍的设计问题

给定域对象:

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

    methods, etc...
}
我们需要存储描述项的特定字符串属性集。它可以是重量,颜色,大小等。系统必须是灵活的,能够持久的可变列表o属性。它需要存储允许的属性名称,最好强制执行其中的一些属性名称

我尝试了几种方法,但所有项对象共享的公共约束的概念并不适合任何标准域模型

因此,我开始将约束视为一种配置形式。每个项目都有自己的属性(在简单的字符串映射中),另一方面,约束是所有项目的公共配置。于是下一个迪莱玛出现了。。。如何表达它而不在域模型中留下大洞

引入额外的应用层对象来存储约束很容易,但“允许/必需的属性”是业务事务,我们需要允许域用户(某种类型的管理者)更改它,因此将此逻辑从域层中分离出来感觉非常糟糕

欢迎提出任何建议

编辑1。 经过大量的头脑风暴,我成功地为给定的情况创建了有效的对象模型。乍一看,不可能用通用约束封装属性,但最新的域外实现给了我一个想法:

public class Item {
    private Long itemSN;
    private String name;
    private List<Property> properties;
}
公共类项目{
私人长项目n;
私有字符串名称;
私有财产清单;
}
问题的核心在这里得到了解决:

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;
}
公共类属性{
私人长期房地产;
私有字符串propertyValue;
私人约束;
}
公共类约束{
私有字符串名称;
需要私有布尔值;
私有列表允许的值;
}
因此,每个属性都有其值和约束对象,约束对象指定名称、允许的值和必需的状态。这样,约束对象可以被许多属性共享,并且这些属性中的任何一个都可以有自己的值。 它给DB映射增加了一些复杂性,并将影响性能,但它也将所有域逻辑保留在域对象中


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

使用注释可以非常合理地解决此问题。注释允许您(编码者)继续使用该语言使用属性,只需使用约束对属性进行注释,同时仍然可以在不使用注释的情况下对用户定义的字段应用相同的约束


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

这些字段是用户定义的吗?我认为你不会期望这些自定义项与其他有界上下文交互?是的,用户应该能够添加另一个用户定义的字段,我认为会有标准的属性集,但它应该是完全可自定义的。这些字段是为存储和显示数据而创建的,不会被任何其他域对象使用。只是想知道,既然这不是域的问题,也许UDF应该以更传统的方式实现,例如CRUD-即将UDF与域模型分离…其合理解决方案,但它将为UDF实现引入一些领域逻辑。我希望有更优雅的解决方案。