上一文主要讲了DDD体系架构以及每一层主要的作用,这篇主要描述各层之间如何进行交互,以及交互的最佳实现方式。
1.应用层某个应用层服务被界面层调用,开始启动。
2.对于需要新增领域对象的情况,应用层调用领域层中某个领域对象(聚合根)的构造函数或工厂创建出领域对象,然后调用领域对象的某些方法进行相关的业务操作,操作完成后,应用层服务将新创建的领域对象添加到仓储中。
3.对于需要修改领域对象的情况,应用层服务通过仓储获取领域对象,然后调用领域对象的某些方法进行相关的业务操作,操作完成后,应用层服务将新修改的领域对象添加到仓储中。
4.如果一个操作设计到多个领域对象,则应用层服务调用领域层的某个领域服务完成操作。
5.最后通知工作单元将仓储中的领域对象以事务的方式持久化到数据库中。
在实际的开发经验中,有以下几点需要特别说明:
1.一般通过应用层访问仓储,而且是使用领域层定义的仓储接口,具体仓储的实现调用可以通过IOC的机制在应用层通过服务定位器模式找到。
2.一般不要再领域层访问仓储,如果领域层中的领域对象或领域服务的业务逻辑处理确实需要访问仓储,建议不通过服务定位器的方式在领域层进行服务解析,而是应该在领域对象或领域服务的构造函数中传入仓储接口,具体是哪个仓储实现仍然在应用层通过服务定位器模式找到,这样能够保证领域层只关注业务,而不关注其他的方面。
3.一些界面需要获取的查询信息,不应该通过领域对象直接返回给应用层服务,然后应用层服务返回给界面。通常界面需要的信息可能来源于领域对象的一部分状态,也有可能来源于多个领域对象的组合,这时应该在应用层实现DTO。DTO定义的就是界面所需要显示的状态,应用层服务应该能够将DTO与领域对象间作映射、组合或转换,以更好的实现界面信息的展示。