作者回复: 这两天会加一篇完整的代码详解。
作者回复: 1、实体的这些数据库映射是通过mapper来实现的。
2、松散分层架构是可以跨层调用了,实现起来很容易。但是在复杂的情况下,服务不太容易管理,比如,你可能不知道你的方法到底被谁组合和封装了,一旦出现方法变更,你不容易一次找出所有受影响方。而逐层封装的话,你只需要逐层通知到上层就可以了。
3、微服务内的服务编排相对简单,就是业务逻辑的执行顺序而已,个人感觉不需要引入什么工具。
作者回复: 谢谢指出,图已调整。
作者回复: 如果直接对外暴露的话,建议封装一下。避免业务逻辑泄露。
作者回复: 实体的功能实现是在聚合根,其它服务只是封装和编排,服务内部不实现实体的业务逻辑,所以不会出现功能重叠的情况。有些前端可能不需要服务组合和编排,直接调用创建客户的方法,这就是跨层暴露,所以建议封装一下后,再暴露。
作者回复: 等我有时间的时候,我整理一个吧。
作者回复: 实体对象的方法在实体类内实现,有些领域服务只是做封装或者组合编排。
领域逻辑别放到应用服务中去,容易让领域模型逻辑与编排逻辑出现混乱,最后做成三层架构了。
作者回复: 实体自身的方法来完成增删改,复杂查询可以交由应用服务来做。仓储接口可以在应用服务或者领域服务中调用,也可以是聚合根的方法里。
作者回复: 复杂聚合用工厂来实现吧。
作者回复: 通过工厂来完成所有关联实体的初始化。一般都在领域服务里面来调工厂和仓储完成持久化。
作者回复: 两个都可以的。后面的微服务样例我用的是JPA,过一段时间后我会发给大家的。
作者回复: 不好意思啊,没有接触过nopcommerce相关的的组件。微服务之间的领域事件大多还是通过消息中间件的模式。你说的注册和监听是不是指的微服务内部事件总线的功能,如果能实现领域事件的发布和监听,能实现不同聚合之间的解耦,我觉得应该是可以用的。
作者回复: 你可以在用户接口层创建DTO类和assembler类。在assembler类里完成映射。
作者回复: 你说的是微服务之间的服务调用,还是微服务内的应用服务或领域服务?微服务之间服务调用可以通过API网关来调用,API网关是基础层的组件。微服务内的服务调用,直接服务跨层调用就可以了。
作者回复: 持久化是通过仓储来做。这样通过依赖倒置,可以解耦领域模型实现与数据库资源。
作者回复: 聚合根由于管理了聚合内所有的实体和值对象,它的有些方法其实可以替代部分领域服务的功能。但是我建议聚合根本身的业务行为放在聚合根的方法内,聚合内的所有领域服务用一个单独的领域服务类来实现。
应用服务应该调用领域服务。
作者回复: 这个只是代码存放目录的考虑。具体的持久化是在仓储实现的服务里面。为了方便聚合的重新组合,我在代码目录结构里面将仓储的接口和实现都放在领域层的聚合目录下,如果微服务架构演进,你可以直接将聚合相关的代码一起拿走。