【领域驱动设计】CQRS体系结构模式实践案例发布:Tiny Library 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):

image

 

注意:在单击上图的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按钮
    image

  • 当系统完成配置以后,单击Finish按钮关闭对话框
  • 关闭Add or Remove Programs对话框
  • 在Windows XP SP3上单击Start,右键单击My Computer图标,然后选择Manage菜单项,这将打开Computer Management对话框
    image

  • 在Computer Management对话框中,展开Computer Management (Local) –> Services and Applications –> Message Queuing节点,右键单击Private Queues,在弹出的菜单中,选择New –> Private Queue,这将打开New Private Queue对话框
    image

  • 在New Private Queue对话框的Queue name文本框中,输入TinyLibraryCQRS_EventBus,并勾选Transactional选项,以表示该队列为事务性队列。注意:此选择必须勾选,否则Tiny Library CQRS无法将领域事件的发布提升到DTC级别,在MSMQ发生异常时会造成数据不一致。当消息队列创建成功后,此选项不可更改
    image

  • 单击OK按钮关闭New Private Queue对话框,此时会创建一个名为TinyLibraryCQRS_EventBus的私有队列

启动Distributed Transaction Coordinator服务

确保Distributed Transaction Coordinator服务处于已启动状态。

  • 单击Start –> Control Panel
  • 在Control Panel中双击Administrative Tools图标
  • 双击Services图标,找到Distributed Transaction Coordinator服务,确保其处于已启动状态。如未启动,可以单击工具栏的启动按钮进行启动
    image

 

配置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的事件,此时会弹出对话框要求用户保存事件信息
    image

  • 也可以在上面的右键菜单中选择Properties选项,在弹出的Application Properties对话框中增加Event Log的大小配额
    image

配置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对话框
    image

  • 在Create New SQL Server Database对话框中,设置好Server name以及验证信息,然后填写数据库名。在此建议使用TinyLibraryCQRS_EventDB作为数据库名称,如下:
    image

  • 以上述相同的方式创建另一个数据库,命名为TinyLibraryCQRS_QueryDB
  • 在Visual Studio 2010的Solution Explorer中,展开Scripts节点,双击打开TinyLibraryCQRS_EventDB.sql脚本文件,在打开的编辑器中单击鼠标右键,选择Execute SQL以执行脚本
    image

  • 以相同的方式执行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的数据库连接:
      <connectionStrings>
        <add name="EventDBConnectionString" connectionString="<your_connection_string>"/>
      </connectionStrings>
  • 打开TinyLibraryCQRS.Services.QueryServices项目,双击web.config文件,在该文件下编辑以下节点以替换QueryDB的数据库连接:
      <connectionStrings>
        <add name="QueryDBConnectionString" connectionString="<your_connection_string>"/>
      </connectionStrings>
  • 打开TinyLibraryCQRS.Services.SynchronizationService项目,双击app.config文件,在该文件下编辑以下节点以替换QueryDB的数据库连接:
      <connectionStrings>
        <add name="QueryDBConnectionString" connectionString="<your_connection_string>"/>
      </connectionStrings>

运行Tiny Library CQRS案例

  • 在Visual Studio 2010中编译整个TinyLibraryCQRS解决方案
  • 在TinyLibraryCQRS.Services.CommandServices项目下找到CommandService.svc,右键单击并选择View in Browser选项,此时会启动Command Service(占用端口:1036)
    image

  • 以相同的方式,在TinyLibraryCQRS.Services.QueryServices项目下找到QueryService.svc,右键单击并选择View in Browser选项,此时会启动Query Service(占用端口:1093)
  • 在文件系统中找到TinyLibraryCQRS.Services.SynchronizationService\bin\Debug目录,双击该目录下的TinyLibraryCQRS.Services.SynchronizationService.exe文件,以启动同步服务。同步服务启动成功后,会出现下面的界面:
    image

  • 启动TinyLibraryCQRS.Presentations.Mvc3项目,会打开Tiny Library CQRS的主界面(Web服务器占用端口:1125)如下:
    image

  • 单击Log On按钮,以admin/admin账户登录即可维护图书信息;以daxnet/daxnet账户登录即可维护个人信息、借阅、归还图书

读者朋友如有任何问题,请直接在本文留言,我将尽可能一一解答。有关Tiny Library CQRS的新特性演示,我将在后续的博文中以视频和文字等方式向大家介绍。

posted @ 2011-09-01 13:52  dax.net  阅读(5495)  评论(18编辑  收藏  举报