经过一段时间的DDD学习,第一个开源框架终于初步完成了,我为他命名为ThinkNet。之前或许你听过ThinkPHP,没错,虽然我对php没有过多的掌握,但是借助thinkphp,我也能开发一个web应用程序。所以我也想写一个框架能够帮助快速开发基于DDD考虑的应用程序。

首先要感谢园子里的dax.net和netfocus的文章对于我入门DDD提供了很大的帮助,同时他们也都有实现各自风格的框架,如果你阅读过我的源码也许能从他们的框架中找到一点影子,可以说没有他们的源码分享,我也很难从无到有写出ThinkNet。再次对他们的无私奉献表示感谢。

ThinkNet支持CQRS+ES(可选)或者经典DDD两种不同的风格,可以说尽量做到两种都兼容或者混搭(部分业务采用CRQS,部分采用经典的方式),毕竟一个项目完全采用CQRS+ES未免有点过于强求,经典DDD从设计上来说相对比较简单。

在这里再次贴出CQRS较为完整的架构图

一般的项目也不会采用分布式,所以可以忽略上图WCF部分。图例其他部分你都能在ThinkNet一一对应。大致的流程就是一个Command发送到CommandBus中,CommandBus会执行该Command相应的CommandHandler,CommandHandler的一般实现为创建聚合实例或者修改聚合状态,然后保存到Repository中,Repository会先将聚合产生的Event集合持久化(EventStore),持久化成功后会将事件发布到EventBus中,EventBus会执行该事件相应的EventHandler(其中包括同步到Q端数据的Handler),至此,C端的流程就结束了。Q端的业务就相对简单多了,就是一些查询接口设计和实现。

以上Command和CommandHandler及Event和EventHandler的实现主要是用的订阅/发布。框架具体是如何实现的将在后续的文章中作阐述。

说完了CQRS架构,再说一下经典DDD的架构是什么样的。还是先上图

相比CQRS,经典 DDD的架构要简单多了,创建或者修改一个聚合一般的做法是用一个DTO发送到应用层,在应用层创建或重建聚合,然后添加或更新到对应的Repository中,最后由应用层提交事务。

第一篇文章就打算这么多了。此文基本上做了一些简单的介绍,以后的博文我并不会对DDD理论做过多的阐述,因为本人对于DDD的掌握还不足以授于他人,况且园子里也有不少文章了。我将重点放在具体应用上,我也是一个码农,解决问题是我们这些码农的日常工作,所以我尽量对想即将使用DDD或者想了解DDD的人提供一些信息。

ThinkNet终于见面了的更多相关文章

  1. 开始DDD

    如何开始DDD(完) 连续写了两篇文章,这一篇我想是序的完结篇了.结合用户注册的例子再将他简单丰富一下.在这里只添加一个简单需求,就是用户注册成功后给用户发一封邮件.补充一下之前的代码 public ...

  2. Knockout学习之控制流绑定器

    控制流绑定器 “foreach”绑定 顾名思义,通过该绑定我们就可以将监控数组循环输出到页面中去了,当然我们还是先来段简单的示例,仅仅只是输出监控数组: <ul data-bind=" ...

  3. 2021 CSP-J复赛 我的备战与游记

    目录 备战 2021.10.18 2021.10.19 2021.10.20 2021.10.21 2021.10.22 比赛当日 早上 线下见面 正文 比赛后 赛后总结与讲解 简单总结 Candy ...

  4. Power BI Q&A终于在圣诞前夕盼到

    相信跟所有的数据分析师们一样,赶上年底和年初都是非常忙的时候,即使赶上哪天运气好不加班每天回到家吃完饭恨不得倒在床上就美美的睡上一觉.本人也是如此,正直疲惫之际,尹相志在微博上把我一圈,说Power ...

  5. 我的新书《C++服务器开发精髓》终于出版啦

    一.千呼万唤始出来 亲爱的各位读者,我的新书<C++ 服务器开发精髓>终于终于终于与大家见面了,图书如下: 图书的封面设计很精美,当然内容一定不负众望.因出版社老师要求提供一张照片放到封面 ...

  6. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  7. MySQL常见面试题

    1. 主键 超键 候选键 外键 主 键: 数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 超 键: 在关系中 ...

  8. eclipse启动优化,终于不那么卡了!

    eclipse启动优化,终于不那么卡了! 网上找了好多都是myEclipse的优化的,跟eclipse有点区别,找了很多方法还是不能让这个eclipse(Version: Kepler Release ...

  9. C#终于支持可选参数了!

    今天偶然看了一下C#4.0的新特性, 第一个新特性就令我兴奋不已, 曾经一度令我使用C#很不习惯的"死参数"问题终于搞定了.实在太爽了! 过去用C++, VB.NET的时候都很爽, ...

随机推荐

  1. shell命令,从字符串中提取数字

    echo "2014年7月21日" | tr -cd "[0-9]" 这样就可以提取出2014721

  2. cast

    https://blog.csdn.net/seabeam/article/details/47841539 在UVM中经常可以看到$cast的身影,这是SV的build-in task之一,当然它还 ...

  3. est-framework框架的基本组件

    rest-framework框架的基本组件   快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列 ...

  4. 31.Mysql复制

    31.Mysql复制复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对重做日志,从而使从库与主库保持同步.Mysql支持一台主库同时向多台从库复制,从库也可以作为其 ...

  5. Apache Beam是什么?

    Apache Beam 的前世今生 1月10日,Apache软件基金会宣布,Apache Beam成功孵化,成为该基金会的一个新的顶级项目,基于Apache V2许可证开源. 2003年,谷歌发布了著 ...

  6. UVA 10534 Wavio Sequence

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=17&p ...

  7. [Machine Learning][The Analytics Edge][Predicting Earnings from Census Data]

    census = read.csv("census.csv")library(caTools)set.seed(2000)spl = sample.split(census$ove ...

  8. 关于git 命令的一些事

    克隆代码命令 http://www.yiibai.com/git/git_clone.html 关键:得实现新建本地仓库文件夹 ==> git clone 远程网址 git 上传主要代码:htt ...

  9. Java程序员职业生涯规划

    一.规划 工作3年了,感觉自己的技术现在到了一个瓶颈,在做一些重复性的业务性的工作,没有长进,提高太慢:因此停下脚步对自己的职业生涯做了一个规划,并为之努力奋斗: 20-27岁:技术积累阶段在这 5 ...

  10. springboot读取properties和yml配置文件

    一.新建maven工程:springboot-configfile-demo,完整工程如下: pom.xml <?xml version="1.0" encoding=&qu ...