L-F*_*our 6 .net c# architecture cqrs asp.net-mvc-3
由于上一篇文章(架构:简单的CQS),我一直在思考如何构建一个足够灵活的简单系统,以便以后扩展.
换句话说:我现在不认为需要一个完整的CQRS,但是如果需要的话,我希望以后能够很容易地发展它.
所以我在考虑将命令与查询分开,但两者都基于相同的数据库.
查询部分很简单:基于视图的WCF数据服务,可以轻松查询数据.没什么特别的.
命令部分更难,这里有一个想法:命令当然是以异步方式执行的,因此它们不会返回结果.但是,我的ASP.NET MVC站点的控制器通常需要来自命令的反馈(例如,如果成员的注册成功与否).因此,如果控制器发送命令,它还会生成与命令属性一起传递的事务ID(guid).命令服务接收此命令,将其放入数据库中具有状态'processing'的事务表中,并执行(使用DDD原则).执行后,事务表将更新,以便状态变为"已完成"或"失败",以及其他更详细的信息,如生成的主键.
同时,该站点使用QueryService来轮询此事务的状态,直到它收到"已完成"或"失败",然后它可以根据此结果继续工作.如果轮询事务表并且结果为"已完成"或"失败",则删除该条目.
副作用是我不需要guid作为我的实体的键,这对性能和大小来说是一件好事.
在大多数情况下,可能不需要这种轮询机制,但如果需要则可以.接口的设计考虑了CQS,因此对未来开放.
你认为这种方法有什么缺陷吗?其他想法或建议?
谢谢!
路德
我认为您与您的方法非常接近完整的CQRS系统.
我有一个网站,我曾经做过类似于你描述的东西.我的网站braincredits.com使用CQRS进行架构,所有命令本质上都是异步的.因此,当我创建一个条目时,除了成功提交命令以进行处理(而不是处理它)之外,实际上没有对用户的反馈.
但是我在网站上有一个用户分数(他们的"信用"数)应该随着用户提交更多项目而改变.但我不希望用户继续按F5刷新浏览器.所以我正在做你提出的建议 - 我有一个AJAX呼叫,每隔一两秒就会触发,看看用户的信用计数是否已经改变.如果有,则返回新的金额并更新UI(通过一点动画来吸引用户的注意力 - 但不要过于华丽).
你所谈论的是最终的一致性 - 用户所看到的应用程序状态最终将与系统数据(记录系统)保持一致.这个概念对CQRS来说非常关键,在我看来,这很有道理.只要您检索系统中的数据(无论它是否是基于CQRS的数据),数据就会过时.但是如果你假设并假设客户端最终会保持一致,那么你的方法是有意义的,你也可以设计你的UI来解释它并利用它.
至于建议,我会看你做了多少民意调查,以及你发送和退回的数据量.通过民意调查,这听起来像你不是.但定位应该在您的网站上定期更新的内容,我认为您会很好.
查询端的WCF数据服务层是一个好主意 - 只需确保它只能读取(我确信你已经完成).
除此之外,听起来你有一个良好的开端.
我希望这有帮助.祝好运!
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |