【领域驱动设计】CQRS体系结构模式实践案例发布
如果您不了解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的新特性演示,我将在后续的博文中以视频和文字等方式向大家介绍。
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于【领域驱动设计】CQRS体系结构模式实践案例发布的详细内容...