【发布时间】:2013-09-08 19:16:19
【问题描述】:
通过搜索后,我找不到任何可以回答这个问题的问题,在我看来,这是相当常见的设计问题。
给定域对象:
public class Item {
private Long itemSN;
private String name;
methods, etc...
}
我们需要存储描述项目的特定字符串属性集。它可以是重量、颜色、尺寸等。系统必须是灵活的并且能够保持可变的属性列表。它需要存储允许的属性名称,并最好强制执行其中一些。
我尝试了几种方法,但所有 Item 对象共享的公共约束的概念不适合任何标准域模型。
所以我开始将约束视为一种配置形式。每个项目都有自己的属性(在简单的字符串映射中),另一方面,约束是所有项目的通用配置。于是下一个难题出现了……如何在不给领域模型造成大漏洞的情况下表达它?
很容易引入额外的应用层对象来存储约束,但是“允许/需要的属性”是商业事务,我们需要允许域用户(某种经理)来改变它,所以画这个感觉真的很糟糕远离领域层的逻辑。
欢迎提出任何建议。
编辑 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;
}
因此,每个属性都有其值和约束对象,它们指定名称、允许值和所需状态。这样约束对象可以被许多属性共享,并且这些属性中的任何一个都可以有自己的值。 它增加了数据库映射的复杂性并会影响性能,但它还将所有域逻辑保留在域对象中。
欢迎任何改进、建议和意见。
【问题讨论】:
-
字段是用户定义的吗?而且我认为您不会期望这些 UDF 与其他有界上下文交互?
-
是的,用户应该能够添加另一个用户定义的字段,我认为会有标准的属性集,但它应该是完全可定制的。这些字段是为存储和呈现数据而创建的,不会被任何其他域对象使用。
-
只是想知道,因为这不是域的问题,也许 UDF 应该以更传统的方式实现,例如 CRUD - 即将 UDF 与域模型分开......
-
它的解决方案是合理的,但它会为UDF实现画一些领域逻辑。我希望有更优雅的解决方案。
标签: domain-driven-design modeling