作者回复: 一个非常简单的例子,有Person聚合根,Person仓储接口和仓储实现。
/**
* Person聚合根
*/
public class Person{
private String id;
private String name;
private int age;
private boolean gender;
}
/**
* Person仓储接口
*/
public interface PersonRepositoryInterface {
void save(Person person);
void delete(String id);
}
/**
*Person仓储实现
*/
@Repository
public class PersonRepositoryImp implements PersonRepositoryInterface {
private PersonMapper mapper;
public void save( Person person) {
mapper.create(person);
}
public void delete((String id) {
mapper.delete(id);
}
}
在应用逻辑中直接用仓储的接口就可以了,数据库相关的逻辑在PersonMapper里面实现。
PersonRepositoryInterface personRepos;
personRepos.save(person)
作者回复: 一般通过聚合根来做。
作者回复: 事件总线就是一个带发布和监听功能的jar包,直接跟你的微服务代码放一起就行了,它属于基础层的代码。提的比较多的是EventBus。你可以去网上找找资料。
作者回复: 感谢,写的很好。
作者回复: 你这种方式可能就不适合充血模型了。
DDD用充血模型的主要目的是为了在领域模型中体现实体的业务行为,而不是所有实体的行为混杂在一起。但是这只是一个建议的设计原则,贫血模型有时候也是不可避免的。
作者回复: 这个需要权衡,看看引入事件总线后,这个复杂度可不可以接受。通过应用服务加事务机制应该也可以解决,在同一个进程内的事务应该比跨微服务的事务相对来说还是好控制,对性能影响也会小一些吧。
作者回复: 建议先把专栏看完,然后再刷几遍。结合项目实践后,再回过来刷几遍。DDD是一个比较复杂的体系,需要理解和回味。
作者回复: 工厂模式一般用于比较复杂的聚合的数据初始化。仓储一般是PO和DO之间的转换。
DTO和DO之间一般都是应用层与外部,比如前端或者其它微服务之间的转换,转换过程一般不会太复杂,直接转换就可以了。
作者回复: 事件风暴是领域建模的手段,头脑风暴是事件风暴中梳理业务场景和旅程的一种交流方式。详细信息你可以了解一下实战篇的第12节。
作者回复: A的主键是由数据库的序列号生成的吗?
如果是这样,在A的方法里面增加一个生成主键的方法呢。这样就可以在形成PO前,拿到所有实体的数据了。
作者回复: 仓储只是一种应用和数据库解耦的手段,它是一种手段和方法,传统架构也是可以用的。
作者回复: 其实查询类业务可以不必经过聚合根和仓储。传统方法也可以了。
如果聚合数据比较多,会有延迟加载影响性能。
聚合根的主要目的是为了保证数据的一致性,这些场景一般在CU的场景。
作者回复: 创建完后会初始化数据,变更后的数据会通过仓储持久化。
作者回复: 用仓储的目的是为了隔离相互影响。
你说的这种情况我理解是从哪里调仓储接口的问题吧,比如一个基础层组件A依赖领域层,另一个基础层组件B,依赖基础层组件A,然后B只能从领域层仓储接口调A的接口,不知道理解的对不对哈?
其实在微服务内只要你能够做好代码逻辑隔离,仓储接口放哪里都无所谓。
这样设计只是考虑大部分的情况,为了让代码更清晰一些,毕竟大部分的数据仓储的服务都是从领域层发起的。