【发布时间】:2010-12-28 16:56:12
【问题描述】:
我正在尝试找到一种基于 DDD“规范”查询数据库内容的好方法。
在域驱动设计中,规范用于检查某个对象(也称为候选对象)是否符合(特定于域的)要求。例如,规范“IsTaskDone”如下所示:
class IsTaskDone extends Specification<Task> {
boolean isSatisfiedBy(Task candidate) {
return candidate.isDone();
}
}
上述规范可用于多种用途,例如它可用于验证任务是否已完成,或从集合中过滤所有已完成的任务。 但是,我想重新使用这个很好的领域相关规范来查询数据库。
当然,最简单的解决方案是从数据库中检索我们所需类型的所有实体,并通过循环和删除不匹配的实体来过滤内存中的列表。但显然这对于性能来说并不是最优的,尤其是当我们数据库中的实体数量增加时。
建议
所以我的想法是创建一个“ConversionManager”,将我的规范转换为持久性技术特定标准,想想 JPA 谓词类。服务如下:
public interface JpaSpecificationConversionManager {
<T> Predicate getPredicateFor(Specification<T> specification, Root<T> root, CriteriaQuery<?> cq, CriteriaBuilder cb);
JpaSpecificationConversionManager registerConverter(JpaSpecificationConverter<?, ?> converter);
}
通过使用我们的管理器,用户可以注册自己的转换逻辑,将领域相关规范与持久性特定逻辑隔离开来。为了最小化我们的管理器的配置,我想在我的转换器类上使用注释,允许管理器自动注册这些转换器。
JPA 存储库实现然后可以通过依赖注入使用我的管理器来提供按规范查找的方法。按规范提供查找应该会大大减少我们存储库接口上的方法数量。
理论上,这一切听起来都不错,但我觉得我错过了一些关键的东西。大家觉得我的提议怎么样,符合DDD的思路吗?或者是否已经有一个框架可以做与我刚才描述的相同的事情?
【问题讨论】:
-
人们想知道为什么 Java 会因为过度设计而受到不好的包装......
-
当您有规范的合取(逻辑与)时,您如何处理这种情况?如何将规范的结合转化为查询?
标签: java jpa domain-driven-design specifications