文档章节

学习DDD总结

kut
 kut
发布于 2015/04/28 12:27
字数 863
阅读 138
收藏 5

实体

实体是业务系统中分析得出的业务对象,诸如用户、产品之类的,它们需持久于数据层,有自己的属性。

但实体并不是数据展现层所需的数据载体,它只是一种业务载体。它定义的关于本实体的业务方法,并将这些业务方法所对本实体的改变持久化到数据层。

实体不提供直接修改其内部业务属性的方法,也就是说,不再有setter方法。改变内部业务属性只能是有能表达业务、并能通用语言表达的方法来处理。

实体不提供直接读取其内部业务属性的方法,它是通过值对象对外发布其业务属性(或限制访问)。

值对象

是一种承载数据的不可变的对象。

一般可以这么理解,它只是用来传输数据的,它与具体的业务模型无关。一般情况下它是实体的数据展现形式,因为实体只是业务载体,并不存在展示数据的能力,所以实体要想给展示层显示数据,那么就要转换成一个值对象,让展示层渲染值对象即可,同样,这也解决了如何不使用osiv的问题。

领域服务

有一些业务操作在不好归结为实体方法的时候,那么它就极有可能是领域服务。

又或者有一大流程的、大量业务规则的、并且不好归结为实体方法的时候,那么它一定是领域服务。

领域服务有以下几个特征:

  1. 调用多个实体协同完成一个复杂的逻辑业务流程。
  2. 实体转换值对象。
  3. 返回值为值对象。

过份强调领域服务会导致贫血模型,那么什么时候才是使用实体方法,什么时候才是使领域服务呢?

  1. 因为实体业务属性是不能被外界直接访问的,所以,当你要访问这些业务属性才能完成业务功能的时候,那么就要实现成实体方法,而不是领域服务。
  2. 当一个业务操作是由多个不同的实体协作,并且业务流相当复杂的时候,比方说吧,如果非得由实体方法实现,但是调用方需要调用多个实体方法才能完成这个业务操作的话,那么这个业务操作需要实现成领域服务的一个业务方法。
  3. 如果混有以上两点的,那么肯定是要实现成领域服务,只是实体方法的工作范围会缩窄。

领域事件

经典的观察者模式,但是在这里却是相当有用的。主要体现在以下几个方面:

  1. 更加关注业务本身,而由业务本身所影响产生的附加业务则可以实现为更为专注的业务单元。
  2. 业务与附属操作解偶,系统更易于扩展。
  3. 更容易与其它子系统集成。

领域事件给开发大型的、复杂的系统提供了细化业务的可能。

© 著作权归作者所有

共有 人打赏支持
kut

kut

粉丝 52
博文 109
码字总数 32583
作品 0
广州
技术主管
CSS 右侧固定宽度 左侧自适应 或者 三列布局 左右固定 中间自适应的问题

一: 右侧固定宽度 左侧自适应   第一种方法:左侧用margin-right,右侧float:right 就可以实现。   CSS代码可以如下写: 如上代码就可以实现效果。 第2种方法:左侧同样用margin-right ...

喵王不瞌睡
2014/10/23
0
0
shell脚本学习总结----cut+sort+uniq+tr+find+dd+file

shell脚本学习总结----cut+sort+uniq+tr+find+dd+file =========================================================================== cut =============================================......

doublelinux
2017/10/20
0
0
[.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结

原文:[.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结 一、引用   其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计、领域...

杰克.陈
2017/12/05
0
0
大叔推荐博客索引

以下是我的所有推荐文章,其中多半是文章系列,并且这个索引会在以后过程中进行追加,所以,各位看到的,永远都不是最新的,呵呵! 大叔推荐文章系列 DotNetCore跨平台~文章索引~永久更新(...

mcy247
2017/12/05
0
0
由参加领域驱动大会与自己所想的

2017首届领域驱动技术大会一直是我非常期望的,要非常感谢右军赠送的门票能够让我领略大会风采。 这届大会组织者非常用心,组织了非常多的话题可供探讨,确实大会的内容给我带来的感觉是震撼...

colincheng
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

打包QML程序

1、windeployqt执行路径(D:\Qt\5.12.0\msvc2017_64\bin)加入到PATH中 2、使用Qt自带的命令行交互 Command 终端(Qt 5.12.0 64-bit for Desktop (MSVC 2017))切换到 Release 编译成功的exe...

渣渣曦
22分钟前
0
0
优秀互联网高级测试工程师应该具备的能力

概述 在之前写的互联网高级测试工程师至少具备的能力一文中,提到了测试工程师至少具备的能力,但是并没有提到优秀测试工程师应该具备的能力,下文简单的谈一谈。当然这些全部都是我的个人理...

Sam哥哥聊技术
25分钟前
1
0
webpack项目配置

前端工程化 前端工程化是根据业务特点,将前端开发流程规范化,标准化,它包括了开发流程、技术选型、代码规范、构建发布等等,用语提升前端工程师的开发效率和代码质量。 自动化构建工具 1、...

羊皮卷
28分钟前
0
0
Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的...

开元中国2015
今天
2
0
springboot Whitelabel Error Page(Not Found)解决方案

当出现上图图的错误时注意 报错信息 There was an unexpected error (type=Not Found, status=404). Not Found代表未访问到资源 解决方案:比较访问路径和代码的路径有没有写错 正确的访问路...

斩神魂
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部