2011-08-11 86 views
6

由于一前一后(Architecture: simple CQS)的结果,我一直在想,我怎么能建立一个简单的系统,该系统可以灵活地后来扩展。换句话说:我现在看不到需要成熟的CQRS,但是如果需要的话,我希望以后能够很容易地演化成它。建筑问题

所以我就想来分隔查询命令,但都基于相同的数据库上。

查询部分很简单:基于视图的WCF数据服务很容易查询数据。没有什么特别的。

命令部分是更困难的事情,这里有一个想法:命令当然是以异步方式执行的,所以它们不会返回结果。但是,我的ASP.NET MVC站点的控制器通常需要来自命令的反馈(例如,如果成员的注册成功与否)。所以如果控制器发送一个命令,它也会生成一个与命令属性一起传递的事务ID(一个guid)。命令服务接收到该命令,将其放入状态为“处理”的数据库中的事务表中,并执行(使用DDD原则)。执行后,事务表被更新,以便状态变为“完成”或“失败”,以及其他更详细的信息,例如生成的主键。

与此同时,该网站正在使用QueryService来查询此事务的状态,直到它收到“已完成”或“失败”,然后它可以基于此结果继续其工作。如果事务表被轮询并且结果“完成”或“失败”,则该条目被删除。

副作用是我不需要guid作为我的实体的键,这对性能和大小来说是件好事。

在大多数情况下,可能不需要此轮询机制,但如果需要的话是可能的。接口的设计考虑到CQS,所以对未来开放。

你认为在这种方法的任何缺陷的?其他想法或建议?

谢谢!

路德

+1

为什么要通过WCF数据服务来分离前端?是否有特定的原因,因为我会尽可能简单地保持我的解决方案。 – thekip

+1

+1不参加WCF。 Fowler的第一个分布式对象设计法:不要分发你的对象(来自PoEAA) – Deleted

+0

+1 - 同意@Chris Smith –

回答

5

我觉得你很接近满CQRS的系统与方法。

我有我用来做类似于你所描述的东西的网站。我的网站braincredits.com采用CQRS架构,所有命令本质上都是异步的。所以,作为一个结果,当我创建一个条目,确实没有反馈到除命令以外的用户已成功处理(不在于它处理)提交。

但我在网站上有一个用户评分(他们的“评分”),应该随用户提交更多的项目而改变。但我不希望用户继续点击F5刷新浏览器。因此,我正在做你正在提出的建议 - 我有一个AJAX调用,每隔一两秒就会触发一次,以查看用户的信用计数是否已更改。如果有的话,新的数量会被带回并更新用户界面(有一点动画可以吸引用户的注意 - 但不会太浮华)。

你说的是最终的一致性 - 用户看到的应用程序的状态最终将与系统数据(记录系统)一致。这个概念对于CQR​​S来说非常关键,并且在我看来,这很有意义。只要您在系统中检索数据(无论是否是基于CQRS的数据),数据都是旧的。但是,如果你假设客户端最终会保持一致,那么你的方法是有道理的,你也可以设计你的UI来解决这个问题,并利用它。

就建议而言,我会观察你做了多少民意测验,以及你发送和接收多少数据。不要过度投票,这听起来像你不是。但是,要定期在您的网站上更新哪些内容,我认为您会很好。

查询端的WCF数据服务层是一个好主意 - 只要确保它只能读取(我相信你已经完成了)。

除此之外,这听起来像你是一个良好的开端。

我希望这会有所帮助。祝你好运!