分享一点不成熟的理解,还请本着交流进步的大原则喷之。从去年开始接触和套用DDD以来,已经有1年多时间了。也先后在2个生产项目中主导应用。

一、一些概念

  DDD经典分层:

分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。严格分层架构,某层只能与直接位于其下方的层发生耦合;松散分层架构,则允许任意上方层与任意下方层发生耦合。大原则如此,我一般都是采用松散分层,严格的太夸张,在团队里推广起来挺难的。

  CQRS:

  命令查询职责分离,是由Betrand Meyer(Eiffel语言之父,OCP提出者)提出来的。命令(Command):不返回任何结果(void),但会改变对象的状态。查询(Query):返回结果,但是不会改变对象的状态,对系统没有副作用。在我的实践过程中,其实还是让命令返回了一些主键之类的。

  ES事件溯源:

  在CQRS中,每一个确定的命令操作,不论成功还是失败,只要执行之后就产生相应的事件(Event)。这样只需要把所有系统运行的Event,以及其产生时的数据记录起来,这就是系统的历史记录了,并且能够方便的回滚到某一历史状态。Event Sourcing就是用来进行存储和管理事件的。

  粗略的知道了这几个概念之后,基本上就可以用来理解和构建最基础的领域驱动架构了。

、一般实践

  总体分层结构如下:

  1.presentation 表现层。Web框架选择了BeeGo,Beego是基于MVC的。我将V和C层都放在了表现层。路由设置、Views、以及Controllers这些统在一起都算是表现层的。领域驱动设计,更多关注的是业务,以及其变更时能够比较好的扩展与维护。表现层逻辑也很简单,主要是承接Beego框架转发过来的请求,然后通过memoryBus将请求发布出去,至于是谁订阅了该请求,统一委托给 第三方 HttpServer来处理,这也是 迪米特法则的精要。解除了表现层或者说web请求与具体的处理该请求的业务服务的直接关联(耦合)。这样做的好处,只举一例。业务层可以是独立的分布式服务,不一定跟表现层在一个进程服务里。

 

  2.application应用层。DDD里应用层是很薄的一层,只作为计算机领域到业务领域的过渡层。比如计算机能够识别和传输的肯定是2进制字节流,这一层可以充当翻译,把这些晦涩难懂的机器“语言”,转化为领域业务人员建模出来的语言。或者说是高级计算机编程语言,这里一般会有专门的ViewMode来承接所需的参数数据。这一层直接消费领域层,并且开始记录一些系统型功能,比如日志、事件溯源。

  3. domain领域层。领域驱动设计里最核心的部分了,可以细拆分为聚合根、实体,领域服务等一大堆其他概念。这里不展开详细说明了,简单的理解下 聚合根,负责整个聚合业务的所有功能就行了。这里已Protocol协议为例,该类直接负责完与协议相关的所有业务,对内各种封装,完成所有所需的功能,由聚合根对外统一提供方法。

  4. infrastructure基础架构层。这一层一般主要将所有公共功能抽象整理出来,作为独立的对外输出一些帮助类等。但我这里只是重点放置了仓储功能,也就是和数据库打交道的功能。这一层也是讲求和业务逻辑无关,只重点提供通用的功能。

  5.crossutting、ddd_interfaces、dddcore,这些都不是DDD经典分层里的,主要是用来方便实现DDD所增加和分离出来的一些接口、和基础概念实现。

、一点感悟

  对DDD的理解和应用其实还很不成熟,只是对过去的一点总结。Golang 也是新手,只是看了一遍《Go语言圣经》以及astaxie大神的使用Golang构建web应用。

  确实很Go的面向对象设计,没有继承,而是采用组合的方式来实现OO里的“继承”。尽可能的使用组合而不是继承,也算是面向对象设计的一个原则,Golang天然就直接遵循了。“封装”也很有意思,直接通过首字母是否大小写,“多态”还没怎么了解透彻就不可描述了。再使用Golang实现DDD的时候,也发现了如果有“泛型”就好了的感概。这个时候更能深刻的理解和体会,泛型的好处。不得不佩服下C#的设计者,很早就有了泛型。

  简单的构造出来了一个DDD的实现,不成熟的地方还有很多,但是迭代是个好东西,慢慢的理解和完善。

  代码地址: https://github.com/KendoCross/kendoDDD

  

  

领域驱动(DDD)之我见,基于Golang实现的更多相关文章

  1. 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)

    前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...

  2. 领域驱动(DDD)设计和开发实战

    领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中.大部分关于此主题的著作和文章都以 Eric Evans 的书<领域驱动设计>为基础,主要从概念和设计的角度探讨领域建模 ...

  3. DDD领域驱动设计和实践(转载)

    -->目录导航 一. DDD领域驱动设计介绍 1. 什么是领域驱动设计(DDD) 2. 领域驱动设计的特点 3. 如果不使用DDD? 4. 领域驱动设计的分层架构和构成要素 5. 事务脚本和领域 ...

  4. 基于ABP落地领域驱动设计-03.仓储和规约最佳实践和原则

    目录 系列文章 仓储 仓储的通用原则 仓储中不包含领域逻辑 规约 在实体中使用规约 在仓储中使用规约 组合规约 学习帮助 围绕DDD和ABP Framework两个核心技术,后面还会陆续发布核心构件实 ...

  5. 基于ABP落地领域驱动设计-00.目录和小结

    <实现领域驱动设计> -- 基于 ABP Framework 实现领域驱动设计实用指南 翻译缘由 自 ABP vNext 1.0 开始学习和使用该框架,被其优雅的设计和实现吸引,适逢 AB ...

  6. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则

    目录 系列文章 领域服务 应用服务 学习帮助 系列文章 基于ABP落地领域驱动设计-00.目录和前言 基于ABP落地领域驱动设计-01.全景图 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践 ...

  7. 基于ABP落地领域驱动设计-05.实体创建和更新最佳实践

    目录 系列文章 数据传输对象 输入DTO最佳实践 不要在输入DTO中定义不使用的属性 不要重用输入DTO 输入DTO中验证逻辑 输出DTO最佳实践 对象映射 学习帮助 系列文章 基于ABP落地领域驱动 ...

  8. 基于ABP落地领域驱动设计-06.正确区分领域逻辑和应用逻辑

    目录 系列文章 领域逻辑和应用逻辑 多应用层 示例:正确区分应用逻辑和领域逻辑 学习帮助 系列文章 基于ABP落地领域驱动设计-00.目录和前言 基于ABP落地领域驱动设计-01.全景图 基于ABP落 ...

  9. 领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)

    引言 软件系统面向对象的设计思想可谓历史悠久,20世纪70年代的Smalltalk可以说是面向对象语言的经典,直到今天我们依然将这门语言视为面向对象语言的基础.随着编程语言和技术的发展,各种语言特性层 ...

随机推荐

  1. 使用itop4412开发板单独编译驱动模块

    上面我们的驱动是放在了内核源码的目录下来实现的编译成驱动模块,很多时候我们都是拿到一个驱动源码,不需要把他放到内核源码里面,而是直接把他编译成驱动模块,下面我们来讲下实现方法,我们还是以蜂鸣器的驱动为 ...

  2. 吴裕雄--天生自然 JAVA开发学习:日期时间

    import java.util.Date; public class DateDemo { public static void main(String args[]) { // 初始化 Date ...

  3. vue wangeditor3封装

      <script src="wangEditor/3.1.1/wangEditor.min.js"></script> Vue.component('my ...

  4. springBoot 使用redis 和 StringRedisTemplate 常用操作

    spring boot 使用 redis : 1,pom 引入 redis,貌似springboot 1.5以上的版本,引入redis必须加 <version></version&g ...

  5. 启动outlook时报错:mapi无法加载信息服务msncon.dll

    今天这个Office2010 outlook搞的让人蛋疼,老是说启动outlook时报错:mapi无法加载信息服务msncon.dll. 百度了一下,如下解决方案: 安装路径为D:\NEW Windo ...

  6. 五、Shell脚本高级编程实战第五部

    一.条件表达式 在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作.有时也和if结合,让我们方便判断. test: 1)判断文件是否存在:test -f  file 2) ...

  7. Utf8BomRemover

    // // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler ...

  8. 吴裕雄--天生自然 pythonTensorFlow自然语言处理:Attention模型--训练

    import tensorflow as tf # 1.参数设置. # 假设输入数据已经转换成了单词编号的格式. SRC_TRAIN_DATA = "F:\\TensorFlowGoogle ...

  9. C# 使用 HttpPost 请求调用 WebService (转)

    转自 https://www.cnblogs.com/Brambling/p/7266482.html 之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最 ...

  10. Python语言学习前提:基础语法

    一.变量 1.变量:存储数据.存储数据需要对应内存空间,基于变量的数据类型,解释器会分配指定内存,决定什么数据被存储到内存中. 变量数据类型:整数.小数.字符. 2.变量赋值:变量在使用前必须赋值,赋 ...