如果您不了解CQRS架构中各个系统或组件是如何组织在一起并协调工作的,或者您不了解CQRS架构中事件溯源、快照、领域仓储、消息派发、消息同步等是如何实现的,或者您甚至不了解什么是领域驱动设计、什么是事件驱动架构(Event-Driven Architecture)以及什么是CQRS架构(Command-Query Responsibility Segregation Architecture),那么本文,以及Tiny Library CQRS实践案例,就是您正需要的。Tiny Library CQRS(http://tlibcqrs.codeplex.com)是基于.NET与Apworks(http://apworks.codeplex.com)框架的一套相对完整的CQRS体系结构模式实践案例,全程采用Microsoft/.NET技术进行实践,为Microsoft技术的爱好者提供了一个完整的企业级应用解决方案。
概述
一直以来,我都在业余时间致力于Apworks框架(一套面向.NET的支持面向领域驱动经典架构以及CQRS架构的应用开发框架)的开发与完善工作上,与此同时,为了向广大领域驱动设计爱好者提供一套完整的学习材料,并展示Apworks框架的工作原理,我同时还开发了一个实现CQRS体系结构模式的演示案例:Tiny Library CQRS。它的业务非常简单:管理员可以登录到系统对图书信息进行维护,而普通的用户则可以登录系统实现借书、还书,以及修改自己的个人资料。在去年年底的时候,我曾经发布了Apworks 1.0的Alpha版本,同时也发布了与之对应的Tiny Library CQRS案例,但当时这个版本的演示案例存在很多缺陷。如今,Apworks 2.0即将发布,我也成功地在Apworks 2.0的基础上,对Tiny Library CQRS大动手术,不仅修复了一些缺陷,而且向读者朋友们展示了更多的技术实现细节,比如ASP.NET MVC 3的采用以及分布式事务协调等。当然,Tiny Library CQRS毕竟也只是一个案例演示,在某些方面也还是有较大的完善空间,读者朋友有兴趣可以在其基础上继续实现自己的需求,使其成为一套不仅完整而且完善的演示系统。
Tiny Library CQRS演示了哪些内容
与前版本的Tiny Library CQRS相比,新版本对下面这些内容进行了演示:
- 基于配置文件以及程序代码的Apworks框架配置系统
- 更为完善的Apworks框架启动(Boot Strapper)系统
- 使用Microsoft Message Queuing(MSMQ)作为事件总线的解决方案(与此同时演示了Two Phase Commit(2PC)以及分布式事务协调(Distributed Transaction Coordination))
- ASP.NET MVC 3整合CQRS架构的授权与认证(Authorization & Authentication)
- ASP.NET MVC 3的HtmlHelper扩展
- ASP.NET MVC 3验证(Validation)
- 可配置的事件快照提供者(Event Snapshot Provider):用户可以根据自己的需求配置不同的事件快照提供者,甚至可以使用Apworks所提供的Suppressed Snapshot Provider来屏蔽事件快照的产生
- 可配置的领域仓储:用户可以根据自己的需求来配置不同的领域仓储实现方案,Apworks默认提供多种领域仓储实现方式,用户可以自己决定是否采用支持事件溯源的领域仓储,也可以选用基于经典架构仓储实现的领域仓储。Tiny Library CQRS扩展了Apworks中的EventSourcedDomainRepository,以根据自己的需要实现了特定的TinyLibraryCQRSDomainRepository领域仓储,我强烈建议读者朋友在Tiny Library CQRS的演示中选用TinyLibraryCQRSDomainRepository
- 事件消息派发与数据同步
- Apworks框架对AOP拦截的支持
- 异常处理与日志记录:Tiny Library CQRS具有较好的异常处理与日志记录机制,保证了数据的一致性。当异常发生时,系统会将其记录到Windows的事件日志(Event Log)中,同时以友好的方式向用户提供异常信息
Tiny Library CQRS没有演示哪些内容
以下内容没有包括在当前版本的Tiny Library CQRS演示中:
- 远程MSMQ的访问:目前还未对这个功能进行实验,不过应该是没问题的,有兴趣的朋友不妨试试
- Saga:Saga是一种类似领域事件的东西,但它的发生需要依赖多个领域事件,比如有些业务需要多个领域事件依次到达,并处于一定的状态时才能触发,此时的触发信号就是Saga。目前版本的Apworks还不支持Saga
- 与Microsoft Biztalk Server的整合:这部分功能我想过段时间再向读者朋友展示,目前的Tiny Library CQRS还未实现这部分的功能
下载案例源代码
请在Tiny Library CQRS的主页(http://tlibcqrs.codeplex.com)上下载源代码(目前的Change Set是83079):
注意:在单击上图的Download连接后,会弹出许可证协议对话框,直接点击Agree即可下载。
安装与配置
本文将以Windows XP SP3(英文版)作为操作系统进行介绍(不好意思,我手头虚拟机只有Windows XP SP3的英文版,为了描述的准确性,下面的描述都以界面上的英文文本为主),基于Windows 7的安装过程大致相同,读者朋友可以自己在Windows 7上练习一下Tiny Library CQRS的安装与配置,如遇问题可以在本文给我留言。
先决条件
在安装与配置Tiny Library CQRS之前,请先确保您的机器安装有下列产品或组件
- Microsoft .NET Framework 4.0
- Microsoft Visual Studio 2010 Professional/Ultimate
- Visual Studio 2010 SP1
- Microsoft SQL Server 2008 Express(或者完整版的SQL Server 2008)
- ASP.NET MVC 3
- Microsoft Message Queuing (MSMQ)
- Windows Event Log
安装与配置MSMQ
请按下面的步骤安装与配置MSMQ:
- 在Windows XP SP3上点击Start –> Control Panel,然后双击Add or Remove Programs图标,这将打开Add or Remove Programs对话框
- 在Add or Remove Programs对话框中,选择Add/Remove Windows Components图标,在弹出的Windows Components Wizard中,选中Message Queuing,然后单击Next按钮
- 当系统完成配置以后,单击Finish按钮关闭对话框
- 关闭Add or Remove Programs对话框
- 在Windows XP SP3上单击Start,右键单击My Computer图标,然后选择Manage菜单项,这将打开Computer Management对话框
- 在Computer Management对话框中,展开Computer Management (Local) –> Services and Applications –> Message Queuing节点,右键单击Private Queues,在弹出的菜单中,选择New –> Private Queue,这将打开New Private Queue对话框
- 在New Private Queue对话框的Queue name文本框中,输入TinyLibraryCQRS_EventBus,并勾选Transactional选项,以表示该队列为事务性队列。注意:此选择必须勾选,否则Tiny Library CQRS无法将领域事件的发布提升到DTC级别,在MSMQ发生异常时会造成数据不一致。当消息队列创建成功后,此选项不可更改
- 单击OK按钮关闭New Private Queue对话框,此时会创建一个名为TinyLibraryCQRS_EventBus的私有队列
启动Distributed Transaction Coordinator服务
确保Distributed Transaction Coordinator服务处于已启动状态。
- 单击Start –> Control Panel
- 在Control Panel中双击Administrative Tools图标
- 双击Services图标,找到Distributed Transaction Coordinator服务,确保其处于已启动状态。如未启动,可以单击工具栏的启动按钮进行启动
配置Event Log
Tiny Library CQRS采用Apworks提供的AOP拦截功能实现异常处理。在异常发生时,拦截器会捕获到异常并将其写入系统的Event Log中。因此在运行Tiny Library CQRS之前,请先确保Event Log具有足够的空间以存放日志信息。
- 在Windows XP SP3中单击Start –> Control Panel,然后双击Administrative Tools图标,在其下的视图中,双击Event Viewer,这将打开Event Viewer对话框
- 在Event Viewer对话框中右键单击Application节点,在弹出的菜单中选择Clear all Events选项,以删除所有Application的事件,此时会弹出对话框要求用户保存事件信息
- 也可以在上面的右键菜单中选择Properties选项,在弹出的Application Properties对话框中增加Event Log的大小配额
配置SQL Server数据库
- 将下载的Tiny Library CQRS案例源代码压缩包解压到本地文件夹
- 双击TinyLibraryCQRS.sln文件,以在Visual Studio 2010中打开整个解决方案
- 在Visual Studio 2010中,打开Solution Explorer,右键单击Data Connections节点,选择Create New SQL Server Database选项,这将打开Create New SQL Server Database对话框
- 在Create New SQL Server Database对话框中,设置好Server name以及验证信息,然后填写数据库名。在此建议使用TinyLibraryCQRS_EventDB作为数据库名称,如下:
- 以上述相同的方式创建另一个数据库,命名为TinyLibraryCQRS_QueryDB
- 在Visual Studio 2010的Solution Explorer中,展开Scripts节点,双击打开TinyLibraryCQRS_EventDB.sql脚本文件,在打开的编辑器中单击鼠标右键,选择Execute SQL以执行脚本
- 以相同的方式执行Scripts节点下的TinyLibraryCQRS_QueryDB.sql脚本
注意:
1. 脚本中在最开始使用USE语句更改了当前数据库,如果你使用其它的数据库名称,记得将USE中的数据库名替换掉
2. 如果你不是采用的SQL Server 2008 Express,或者你的数据库名不是使用默认的TinyLibraryCQRS_EventDB/TinyLibraryCQRS_QueryDB,请按以下步骤更改Tiny Library CQRS的配置信息:
-
打开TinyLibraryCQRS.Services.CommandServices项目,双击web.config文件,在该文件下编辑以下节点以替换EventDB的数据库连接:
1
<
connectionStrings
>
2
<
add
name
=
"EventDBConnectionString"
connectionString="<your_connection_string>"/>
3
</
connectionStrings
>
-
打开TinyLibraryCQRS.Services.QueryServices项目,双击web.config文件,在该文件下编辑以下节点以替换QueryDB的数据库连接:
1
<
connectionStrings
>
2
<
add
name
=
"QueryDBConnectionString"
connectionString="<your_connection_string>"/>
3
</
connectionStrings
>
-
打开TinyLibraryCQRS.Services.SynchronizationService项目,双击app.config文件,在该文件下编辑以下节点以替换QueryDB的数据库连接:
1
<
connectionStrings
>
2
<
add
name
=
"QueryDBConnectionString"
connectionString="<your_connection_string>"/>
3
</
connectionStrings
>
运行Tiny Library CQRS案例
- 在Visual Studio 2010中编译整个TinyLibraryCQRS解决方案
- 在TinyLibraryCQRS.Services.CommandServices项目下找到CommandService.svc,右键单击并选择View in Browser选项,此时会启动Command Service(占用端口:1036)
- 以相同的方式,在TinyLibraryCQRS.Services.QueryServices项目下找到QueryService.svc,右键单击并选择View in Browser选项,此时会启动Query Service(占用端口:1093)
- 在文件系统中找到TinyLibraryCQRS.Services.SynchronizationService\bin\Debug目录,双击该目录下的TinyLibraryCQRS.Services.SynchronizationService.exe文件,以启动同步服务。同步服务启动成功后,会出现下面的界面:
- 启动TinyLibraryCQRS.Presentations.Mvc3项目,会打开Tiny Library CQRS的主界面(Web服务器占用端口:1125)如下:
- 单击Log On按钮,以admin/admin账户登录即可维护图书信息;以daxnet/daxnet账户登录即可维护个人信息、借阅、归还图书
读者朋友如有任何问题,请直接在本文留言,我将尽可能一一解答。有关Tiny Library CQRS的新特性演示,我将在后续的博文中以视频和文字等方式向大家介绍。