ThinkNet终于见面了
经过一段时间的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终于见面了的更多相关文章
- 开始DDD
如何开始DDD(完) 连续写了两篇文章,这一篇我想是序的完结篇了.结合用户注册的例子再将他简单丰富一下.在这里只添加一个简单需求,就是用户注册成功后给用户发一封邮件.补充一下之前的代码 public ...
- Knockout学习之控制流绑定器
控制流绑定器 “foreach”绑定 顾名思义,通过该绑定我们就可以将监控数组循环输出到页面中去了,当然我们还是先来段简单的示例,仅仅只是输出监控数组: <ul data-bind=" ...
- 2021 CSP-J复赛 我的备战与游记
目录 备战 2021.10.18 2021.10.19 2021.10.20 2021.10.21 2021.10.22 比赛当日 早上 线下见面 正文 比赛后 赛后总结与讲解 简单总结 Candy ...
- Power BI Q&A终于在圣诞前夕盼到
相信跟所有的数据分析师们一样,赶上年底和年初都是非常忙的时候,即使赶上哪天运气好不加班每天回到家吃完饭恨不得倒在床上就美美的睡上一觉.本人也是如此,正直疲惫之际,尹相志在微博上把我一圈,说Power ...
- 我的新书《C++服务器开发精髓》终于出版啦
一.千呼万唤始出来 亲爱的各位读者,我的新书<C++ 服务器开发精髓>终于终于终于与大家见面了,图书如下: 图书的封面设计很精美,当然内容一定不负众望.因出版社老师要求提供一张照片放到封面 ...
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...
- MySQL常见面试题
1. 主键 超键 候选键 外键 主 键: 数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合.一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null). 超 键: 在关系中 ...
- eclipse启动优化,终于不那么卡了!
eclipse启动优化,终于不那么卡了! 网上找了好多都是myEclipse的优化的,跟eclipse有点区别,找了很多方法还是不能让这个eclipse(Version: Kepler Release ...
- C#终于支持可选参数了!
今天偶然看了一下C#4.0的新特性, 第一个新特性就令我兴奋不已, 曾经一度令我使用C#很不习惯的"死参数"问题终于搞定了.实在太爽了! 过去用C++, VB.NET的时候都很爽, ...
随机推荐
- Django缓存设置
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- PC滚动条样式
#jmwin2为外部容器 #jmwin2{ width: 90%; height: 65%; background: white; position: abso ...
- 100-days: ten
Title: Emma Watson(艾玛·沃森), Keira Knightley(凯拉·奈特莉) among stars(众多明星之一) urging(竭力主张,呼吁某事) better pro ...
- MYSQL(Mariadb)
CentOS7下安装MariaDB 添加 MariaDB yum 仓库(官网的,也可以直接用aliyun云的) vi /etc/yum.repos.d/MariaDB.repo [mariadb] n ...
- easyui Tree树形控件的异步加载
Tree控件 $('#partyOrgTree').tree({ checkbox: false, url: getDataUrl, onClick: function (node) { getDiv ...
- 循序渐进VBA EXCEL数据操作小实例
1 向指定单元格区域内写入数据 Sub example1() ) arr() = Array("A", "B", "C", "D& ...
- java 遇到的问题
1.list.sort(new Comparator<String>() { @override public int compare(String o1, String o2) { re ...
- ORM初识和数据库操作
ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据库之 ...
- 巧用 Jersey RESTful WebService框架解决文件上传乱码
一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...
- uart通讯协议
本次设计的源码在http://download.csdn.net/detail/noticeable/9912383 下载 实验目的:通过uart通讯协议的编写,了解FPGA的通讯协议编写的方法. 实 ...