如何避免写出烂的业务代码(2):领域对象与领域服务

栏目: ASP.NET · 发布时间: 5年前

内容简介:为什么把这么小的点拿出来讲,最开始在讨论中领域对象与领域服务时,觉得行为放在service/entity中区别不大,只是一个放置位置的问题,并不影响到代码的抽象和复用,所以没有实行。但是最近在推动产品进行DDD业务建模,发现这个问题非常重要,关系到代码是否清晰表达了业务,这个也是我们进行DDD的初衷。领域对象: 聚合根,实体,值对象 领域的数据与行为, 数据和行为应该与业务产品上的行为关联。领域对象通常是观点

问题

  1. 什么是领域对象

  2. 什么是领域服务

  3. 领域对象的行为,与领域服务的行为区别

原因

为什么把这么小的点拿出来讲,最开始在讨论中领域对象与领域服务时,觉得行为放在service/entity中区别不大,只是一个放置位置的问题,并不影响到代码的抽象和复用,所以没有实行。但是最近在推动产品进行DDD业务建模,发现这个问题非常重要,关系到代码是否清晰表达了业务,这个也是我们进行DDD的初衷。

定义

领域对象: 聚合根,实体,值对象 领域的数据与行为, 数据和行为应该与业务产品上的行为关联。领域对象通常是 有状态 的,理想情况下,我们的领域对象行为应该和产品业务定义意义映射

几个阻抗

  • 觉得行为放在领域服务还是领域对象中区别不大,只是一个放置位置的问题,并不影响到代码的抽象和复用

  • 领域对象中还是只有属性,和对象之间的转换

  • 业务逻辑没有与代码映射

  • manager(持久化操作)放在领域对象中需要进行一个转换(ApplicationContext)或者其他方式

  • 我们的业务很单薄,放在领域对象中的内容后,领域服务就很单薄了。滥用了领域服务导致了领域对象的贫血

  • 领域对象的集合操作

观点

首先需要对概念明确定义,因为DDD其实是做了一个问题的分治,所以必然会导致在某些情况下,会有单薄这个说法。就像垂直架构中dao/manager/service层区分一样。在初期我们可以明确按照概念来放置代码,当大家达成共识,深刻理解了这些概念时,没有其中一层也无所谓了。

举个例子 eg. 一个bad case 三个模型:A,B,C,他们之间存在状态变更流动。

整理出来的状态变更图 如何避免写出烂的业务代码(2):领域对象与领域服务 AService.updateXXStatus

AService.cancelBy

AService.changeStatus()

这些方法都在处理状态,反应不了业务的情况

领域对象:

一般包含以下逻辑

  • 领域对象的限制

    // 如什么样的设计师是不存在的,对于领域外的内容不关心你是不是软删,还是硬删

    public void checkDesignerExist() throws BizzException { // 清退的也是不存在的 if (this == null || this.getStatus().equals(DesignerStatusEnum.DELETE)) { throw DdgCoreResponseCode.convertBizzException(DdgCoreResponseCode.DESIGNER NOT EXIST); } }

  • 领域行为与事件 // 如商品对象的删除,以及事件的publish(不限于CRUD) // 抽奖业务中从奖池中选取奖品

  • 状态的流转

不应该做的事

领域对象不应该与其他的模型有交互,如manager(资源层管理),不应该持久化数据 如何持久化不应该是领域对象关心的。

领域服务

  • 构造(复杂的)领域对象 调用防腐层方法,做支撑域和通用域对象的转换与组合

  • 与dao层打交道

  • 调用其他限界上下文的内容

  • 提供领域方法给其他限界上下文/应用程序调用

领域服务与领域对象的关系

领域服务通常是领域对象的调用方,是微服务架构下,领域对象对外提供的方式。

AService


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高性能MySQL

高性能MySQL

施瓦茨 (Baron Schwartz)、扎伊采夫 (Peter Zaitsev)、特卡琴科 (Vadim Tkachenko) / 宁海元、周振兴、彭立勋、翟卫祥,刘辉 / 电子工业出版社 / 2013-5-1 / 128.00元

《高性能mysql(第3版)》是mysql 领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了最新mysql 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为16 章和6 个附录,内容涵盖mysql 架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可......一起来看看 《高性能MySQL》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具