繁体   English   中英

DDD何时应该创建域对象和持久性对象而不是使用持久性对象作为域对象?

[英]DDD When should I create a domain object and a persistence object instead of using a persistence object as a domain object?

当我对领域驱动设计的理解工作时,我发现我有一个似乎有效的规则,虽然我想看看它是否过度,并且还希望看到相同情况的其他观点。

我的问题是:“域模型和持久性模型应该何时包含在单独的对象中?” 我现在选择的语言是Java,我正在使用Spring Data的存储库模型。

我看到了我的问题的三个主要答案。

  1. 始终使用持久性对象中的单独域对象。
  2. 仅在将域方法(行为)放在持久性对象上时才使用单独的域对象。
  3. 在所有情况下都使用持久性对象作为域对象。

为了询问有关DDD的问题,我发现我必须使用示例有界上下文,因为我还不太了解DDD以更抽象的方式提问。

这是我的说明性有限背景:说我有一个法律编纂系统,其中包含以下业务规则:

  1. 书中的每项法律都必须进行分类。
  2. 每个法律都有一个标识符,包含两部分,编号编号前缀和编码共同分配后缀。 (例如:100-0100,599-2030)。
  3. 有多个法律管辖区正在使用法律编码系统,他们应该能够自己制作共同编号,但编码前缀是全球性的,并且在所有司法管辖区内必须相同,以促进一般可比性。
  4. 编码数字前缀分为广泛的编码类别。 编纂类别具有数字范围,例如100-199,200-299,700-799等。

为了将这个有界的上下文表达为持久性模型,我有以下内容:

table: codification
fields: chart_code, prefix, coassign, codification_category

table: codification_chart
fields: chart_code, jurisdiction_description

table: codification_category
fields: category, low_category_number, high_category_number, description

table: global_codification
fields: prefix, coassign, codification_category

我知道,我应该首先从域模型开始。 我有一个持久性模型和一个域模型

在我的域模型中,我有三个域对象

public Codification {
    private String prefix, coassign;
    codificationCategory codificationCaegory; // an enum type
    public Codification(...) { // set private vars }
    // getters for private variables
}

public CodificationChart {
    private List<Codification> chartCodifications = new ArrayList<>();
    private String chartCode;
    // public constructor to initialize private variables
    // getters for private variables
    public Codification addCodificationToChart(Codification){...}
    public void removeCodificationFromChart(Codification){...}
    public boolean checkCodificationInChart(Codification){...}
}

public enum CodificationCategory {
    CIVIL, CRIMINAL, PROPERTY, CORPORATE, FAMILY, CONSUMER, ETHICS, BANKRUPTCY;
}

ORM对象:

JPA Mappings of the tables mentioned earlier with the "Entity" suffix added to their table names. 
They are omitted for brevity. 
Each one contains getters and setters like JPA Pojos do. 
If someone asks for the Persistence objects code I will post it.

我的域对象知道持久性模型的唯一一点是在我的工厂对象CodificationChartFactory ,它具有我用来与前面提到的ORM对象交互的存储库接口。 此工厂是使用持久性存储库的域的唯一部分,因此是与持久性层交互的唯一部分。

在这里创建一个单独的域模型是浪费精力吗? 我可以看到如何将我的CodificationChart行为放在Persistence对象上。 将这些行为放在持久性对象上只是某种方式感觉是错误的,唯一的工作就是从数据库中检索记录。

我肯定会被纠正。

两种方法都是正确的,从设计的角度来看是一种品味问题。 有些人不希望他们的域对象与持久性有任何关系,并且创建一个额外的Entity对象层...有些人不认为这是一个主要问题,并且很乐意继续使用域对象作为持久性对象。

就个人(和主观)而言,我认为使用JPA并拥有额外的Entity对象层是错误的方法。 像Hibernate这样的ORM的目标是成为Object和Relational模型之间的桥梁(我知道它在名称中:)。 我认为一种更好的方法,在一个人想要保持分离的情况下,是使用类似mybatis或纯SQL的东西,但绝对不是JPA ...否则它只是为了复杂性而增加复杂性(JPA不是最简单的学习框架)

我很高兴能够使用混合并注释我的域对象。 据我所知,它使持久性更容易管理...但与此同时,我觉得Hibernate / JPA非常舒服,并且已经使用了10年:)。

3年前我有一个非常类似的问题,我发布在程序员网站上 - ORM是否可以创建丰富的域模型?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM