Domain driven design 如何使用原始JDBC或Mybatis实现DDD存储库模式?

Domain driven design 如何使用原始JDBC或Mybatis实现DDD存储库模式?,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,假设我有一个复杂的聚合根(AR) 在用户事务中,我将此AR乘以: ar.doSomeThing1(); ar.doSomething2(); ar.doSomething3(); ar.doSomething4(); 然后我使用存储库来持久化所有更改 arRepo.update(ar) 我的问题是如何实现arRepo.update使用行JDBC或Mybatis 主要困难是: arRepo不知道发生了什么变化,唯一的方法是更新数据库中的所有ar数据 主要原则是您的DDD核心不应该了解JDBC

假设我有一个复杂的聚合根(AR)

在用户事务中,我将此AR乘以:

ar.doSomeThing1();
ar.doSomething2();
ar.doSomething3();
ar.doSomething4();

然后我使用存储库来持久化所有更改

arRepo.update(ar)
我的问题是如何实现
arRepo.update
使用行JDBC或Mybatis

主要困难是:

  • arRepo
    不知道发生了什么变化,唯一的方法是更新数据库中的所有
    ar
    数据
    主要原则是您的DDD核心不应该了解JDBC、TCP或ORM。它所知道的一切都应该用一种无处不在的语言来表达

    但这并不意味着它不应该知道发生了什么变化。您可以使用某种事件源并将事件保存在AR下,从AR中可以导出必要的更新

    也许这不是非常面向对象的,但您可以尝试一下。实际上,AR可以表示为决策者,决策者获取更改其状态的请求,决定是否接受这些请求,然后存储状态更改事件的列表

    然后,您需要将此事件列表简化为某个读取模型,但如果您使用这种方法,这不是AR的责任

    当我提到决策时,我指的是一个纯粹的功能,它不去磁盘或网络上获取数据。这意味着,所有必要的数据都应该在决策之前收集,并在决策之后保存。这就是应用层


    这个应用层是与存储库或网络适配器交互的人。它还可以处理交易等。接下来,计算SQL更新查询是存储库的实现细节。但是,只要状态变化用普遍存在的语言表示,聚合和域核心就可以很好地了解它。

    主要原则是,DDD核心不应该了解JDBC、TCP或ORM。它所知道的一切都应该用一种无处不在的语言来表达

    但这并不意味着它不应该知道发生了什么变化。您可以使用某种事件源并将事件保存在AR下,从AR中可以导出必要的更新

    也许这不是非常面向对象的,但您可以尝试一下。实际上,AR可以表示为决策者,决策者获取更改其状态的请求,决定是否接受这些请求,然后存储状态更改事件的列表

    然后,您需要将此事件列表简化为某个读取模型,但如果您使用这种方法,这不是AR的责任

    当我提到决策时,我指的是一个纯粹的功能,它不去磁盘或网络上获取数据。这意味着,所有必要的数据都应该在决策之前收集,并在决策之后保存。这就是应用层


    这个应用层是与存储库或网络适配器交互的人。它还可以处理交易等。接下来,计算SQL更新查询是存储库的实现细节。但只要状态变化用普遍存在的语言表示,聚合和域核心就可以很好地了解它。

    “更新数据库中的所有ar数据。”这对我来说很有意义,因为聚合代表一致性边界。更新数据库中的整个聚合时,您面临的问题是什么?@dnmyar数据太多,实现起来太复杂。在更新之前,我必须检查数据库中是否存储了实体或值对象,如果存在,则更新,如果没有,则插入“更新数据库中的所有ar数据”。这对我来说很有意义,因为聚合表示一致性边界。更新数据库中的整个聚合时,您面临的问题是什么?@dnmyar数据太多,实现起来太复杂。在更新之前,我必须检查数据库中是否存储了实体或值对象,如果存在,则更新,如果不存在,则插入。