Mar*_*ski 5 modeling domain-driven-design
经过搜索后,我无法找到任何可以回答这个问题的问题,在我看来,这是相当常见的设计问题。
给定域对象:
public class Item {
private Long itemSN;
private String name;
methods, etc...
}
Run Code Online (Sandbox Code Playgroud)
我们需要存储描述项目的特定字符串属性集。它可以是重量、颜色、尺寸等。系统必须灵活并且能够保留可更改的属性列表。它需要存储允许的属性名称,并且最好强制执行其中的一些属性名称。
我尝试了几种方法,但所有 Item 对象共享的公共约束的概念不适合任何标准域模型。
所以我开始将约束视为一种配置形式。每个项目都有自己的属性(在简单的字符串映射中),另一方面约束是所有项目的公共配置。那么下一个困境出现了......如何表达它而不在领域模型中造成大漏洞?
引入额外的应用程序层对象来存储约束很容易,但是“允许/必需的属性”是商业事务,我们需要允许域用户(某种管理者)更改它,所以从这个逻辑中抽离出来感觉真的很糟糕域层。
欢迎任何建议。
编辑1。 经过大量的头脑风暴,我设法为给定的情况创建有效的对象模型。乍一看,用通用约束封装属性是不可能的,但最新的域外实现给了我一个想法:
public class Item {
private Long itemSN;
private String name;
private List<Property> properties;
}
Run Code Online (Sandbox Code Playgroud)
问题的核心在这里得到了解决:
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;
}
Run Code Online (Sandbox Code Playgroud)
因此,每个属性都有其值和约束对象,该对象指定名称、允许的值和所需的状态。这样约束对象可以被许多属性共享,并且任何属性都可以有自己的值。它增加了数据库映射的复杂性,并且会影响性能,但它也将所有域逻辑保留在域对象中。
欢迎任何改进、建议和意见。
通过使用注释可以非常合理地解决这个问题。注释允许编码人员通过简单地用约束注释属性来继续使用属性的使用语言,同时仍然可以将相同的约束应用于没有注释的用户定义字段。
JSR-349是应用此类约束的 Java 标准。Hibernate 验证器是一个众所周知的实现。