1
xuanbg 2020-12-01 19:41:57 +08:00
不是你的数据模型设计错了,就是你的领域模型设计错了……
|
2
xiangwan 2020-12-01 19:46:58 +08:00 via Android
了解下领域模型和数据模型解耦合
|
3
asanelder OP |
4
xiangwan 2020-12-01 20:56:17 +08:00 via Android
领悟模型有人也叫成业务模型,对象模型,可以换着搜搜
有个解藕思路是,在仓储层转换领域对象和数据对象 主要是转换下思维,不执意让数据表和领域模型完全对应。可以像上面提到的,在数据访问层进行转换 |
5
asanelder OP |
6
CoderGeek 2020-12-01 21:43:25 +08:00
我最近也在搞 ddd 费劲
|
7
xiangwan 2020-12-01 22:07:06 +08:00 via Android
|
10
xiangwan 2020-12-02 02:12:44 +08:00 via Android
|
12
huifer 2020-12-02 09:22:39 +08:00
聚合根是否需要落地是个问题. 有些可能是联合查询对外暴露, 聚合根落地的话简单的形式就是各个外键 id 存储
|
13
asanelder OP |
14
CoderGeek 2020-12-02 09:58:24 +08:00
@xiangwan 我的想法是没有所谓绝对标准,不管什么架构模式都是一步步沉淀的 还是得明白业务领域,不说写什么的问题,起码前期梳理的全面 大模块不会跑偏, 这个东西确实需要有一定沉淀的业务人员和技术人员 要么连好事都算不上 浪费时间
|
16
leoskey 2020-12-02 10:10:51 +08:00
我是参考 https://www.cnblogs.com/uoyo/p/12167224.html 的实践,有些落地难得地方需要妥协
|
17
iamppz 2020-12-02 10:16:23 +08:00
聚合根和数据库对象之间通过 Converter 来 serialize 和 deserialize
|
18
asanelder OP |
19
asanelder OP |
20
hantsy 2020-12-02 13:31:12 +08:00
技术上使用 Spring Data 的话,它已经抽象了 DomainEvent,AggregrateRoot 处理,适用大多数 Spring Data 子项目,包括 Spring Data JPA, 请参考 Spring Data 文档。
https://docs.spring.io/spring-data/data-commons/docs/current/api/org/springframework/data/domain/DomainEvents.html https://docs.spring.io/spring-data/data-commons/docs/current/api/org/springframework/data/domain/AbstractAggregateRoot.html 另外代码层面实现上,充分利用 Spring 特性,比如 ApplicationEvent 处理 Domain Event,Message Broker 来实现跨 Domain (不同的 BoundedContext )数据同步。 Domain 建模,Aggregate Root 的颗粒度源于实践,怎么具体处理,取决你的长期经验。经验需要不断积累,不断试错和踩坑,技术架构也是需要不断演进的。理论上很多东西一看就明白,落地很难,比如 Single Reponsibility 拿到国内,细化接口规范后,有些人就只会比较字符数量,便得出结论是增加了任务量。 |
21
hantsy 2020-12-02 13:38:51 +08:00
|
22
hantsy 2020-12-02 13:42:34 +08:00
Spring Data @DomainEvents 的使用,https://www.baeldung.com/spring-data-ddd
|
23
kvkboy 2020-12-02 13:44:01 +08:00
|
24
kvkboy 2020-12-02 13:45:06 +08:00
@kvkboy 手快不小心不小心发出去了,可以看看这个文章,挺有参考的价值。不过更多的还是需要看书,ddd 经典的两本一本理论一本落地
|
25
hantsy 2020-12-02 14:28:16 +08:00
@kvkboy 六边形和洋葱不错,特别六边形,把系统进出接口进行隔离,感观比较清晰。
文章提到的 Cargo 例子作为 Eric 原书 DDD 的一部分,使用了 Spring 框架,现在已经有各种版本了。 Eclipse EE4J 官方也维护了一个基于 Java EE/Jakarta EE 规范的 Cargotraker. https://github.com/eclipse-ee4j/cargotracker |
26
hantsy 2020-12-02 14:30:19 +08:00
|
28
Kirsk 2020-12-02 19:06:32 +08:00 via Android
Ddd 是业务建模 不是数据建模 不懂业务还是不要玩
|
30
hantsy 2020-12-02 20:43:24 +08:00
@iamppz 理想的设计层面,Domain 建模不会考虑到数据库,到真正实现的时候才考虑。如果 Domain 模型与数据库有关系,就是 DDD 中的 Entity,最终要持久化,不得不考虑到数据库的问题。
国内的实践,直到现在很多人做项目或者产品还是本末倒置,需求一到,数据库 Schema 优先设计,使用一些工具自动生成 Entities (或者什么框架需要的类似的东西,这只是数据库的 Entities,与 Domain Model 中 Entities 无关)。从一开始就是面向数据库的,最终业务都是围绕数据存储。以前项目中经常遇到有谈业务的时候,没两句直接会想到数据库存放,页面一个搜索框,能够联想到联合查询等,完全脱离不了数据库思维。 |
31
asanelder OP |
32
dandankele 2023-04-19 14:35:40 +08:00
@asanelder 用 DDD 充血模型确实爽。。但我还卡在怎么用 jpa 将 data object 与 domain object 进行转化。。目前打算用的是 mapStruct 进行转化。。
另外还有个问题,spring data jpa 中的 repository 只是用来查询 data object 了吧?我觉得它的 repository 与 DDD 的 repository 其实不是同一个概念了。。 |