CQRS:实战最简单的CQRS

背景

有些刚接触CQRS的朋友容易被Event Sourcing带到沟里去,其实CQRS和Event Sourcing没有直接的关系,本篇文章我就介绍一种不用Event Sourcing的CQRS。

最简单的CQRS架构

架构图

关键思路

一、Comamnd和Query采用完全不同的组织思路。

二、Command执行后如果希望返回数据给UI,同步的使用Query进行查询。

三、Command和Query采用一个数据库。

代码示例

下载地址:http://yunpan.cn/Q5bkD3wmVXBpv (访问密码:9c16)。

运行效果

主要代码

TestDynamicQueryController.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 using Happy.Query;
 7 using Happy.Query.PetaPoco;
 8 using Happy.Web.Mvc.Ext;
 9 
10 namespace Happy.Web.Mvc.Host.Controllers
11 {
12     public class TestDynamicQueryController : DynamicQueryController<TestDynamicQueryService>
13     {
14         protected override TestDynamicQueryService QueryService
15         {
16             get
17             {
18                 return new TestDynamicQueryService();
19             }
20         }
21     }
22 
23     public class TestDynamicQueryService : PetaPocoDynamicQueryService
24     {
25         public TestDynamicQueryService() :
26             base(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + AppDomain.CurrentDomain.BaseDirectory + @"App_Data\TestDatabase.mdf;Integrated Security=True;Connect Timeout=30", "System.Data.SqlClient", "Tests")
27         { }
28     }
29 }

TestCommandController.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 using Happy.Web.Mvc.Ext;
 8 using Happy.Application;
 9 using Happy.Command;
10 using Happy.Query;
11 using Happy.Web.Mvc.Host.Domain;
12 
13 namespace Happy.Web.Mvc.Host.Controllers
14 {
15     public class TestCommandController : ExtJsController
16     {
17         public ActionResult Create(Test item)
18         {
19             CommandService.Current.Execute(new CreateTestCommand
20             {
21                 Aggregate = item
22             });
23 
24             var query = DynamicQueryObject.Create("Id = @0", new object[] { item.Id });
25             return this.NewtonsoftJson(new
26             {
27                 success = true,
28                 items = this.QueryService.SingleOrDefault(query)
29             });
30         }
31 
32         public ActionResult Update(Test item)
33         {
34             CommandService.Current.Execute(new UpateTestCommand
35             {
36                 Aggregate = item
37             });
38 
39             var query = DynamicQueryObject.Create("Id = @0", new object[] { item.Id });
40             return this.NewtonsoftJson(new
41             {
42                 success = true,
43                 items = this.QueryService.SingleOrDefault(query)
44             });
45         }
46 
47         private TestDynamicQueryService QueryService
48         {
49             get
50             {
51                 return new TestDynamicQueryService();
52             }
53         }
54     }
55 
56     public class CreateTestCommand : SimpleCreateCommand<Test> { }
57 
58     public class CreateTestCommandHandler : SimpleCreateCommandHandler<ITestUnitOfWork, ITestRepository, Test, CreateTestCommand> { }
59 
60     public class UpateTestCommand : SimpleUpdateCommand<Test> { }
61 
62     public class UpdateTestCommandHandler : SimpleUpdateCommandHandler<ITestUnitOfWork, ITestRepository, Test, UpateTestCommand> { }
63 }

备注

采用这种最简单的CQRS,只是在代码层面进行职责的分离。基于Event Sourcing + In Memory + CQRS + DDD 的架构也是值得探讨和尝试的,这种架构汤雪华(http://www.cnblogs.com/netfocus/)有多难的研发和使用经验,估计他的最新框架ENode马上就发布了,到时我会用他的ENode写个Demo,ENode写的真的非常漂亮。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CQRS(Command Query Responsibility Segration)架构,大家应该不会陌生了。简单的说,就是一个系统,从架构上把它拆分为两部分:命令处理(写请求)+查询处理(读请求)。然后读写两边可以用不同的架构实现,以实现CQ两端(即Command Side,简称C端;Query Side,简称Q端)的分别优化。CQRS作为一个读写分离思想的架构,在数据存储方面,没有做过多的约束。所以,我觉得CQRS可以有不同层次的实现,比如: 1.CQ两端数据库共享,CQ两端只是在上层代码上分离;这种做法,带来的好处是可以让我们的代码读写分离,更好维护,且没有CQ两端的数据一致性问题,因为是共享一个数据库的。我个人认为,这种架构很实用,既兼顾了数据的强一致性,又能让代码好维护。 2.CQ两端数据库和上层代码都分离,然后Q的数据由C端同步过来,一般是通过Domain Event进行同步。同步方式有两种,同步或异步,如果需要CQ两端的强一致性,则需要用同步;如果能接受CQ两端数据的最终一致性,则可以使用异步。采用这种方式的架构,个人觉得,C端应该采用Event Sourcing(简称ES)模式才有意义,否则就是自己给自己找麻烦。因为这样做你会发现会出现冗余数据,同样的数据,在C端的db中有,而在Q端的db中也有。和上面第一种做法相比,我想不到什么好处。而采用ES,则所有C端的最新数据全部用Domain Event表达即可;而要查询显示用的数据,则从Q端的ReadDB(关系型数据库)查询即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值