经过一段时间的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开源地址 http://thinknet.codeplex.com
ThinkNet终于见面了