背景
准备采用CQRS架构,之前也简单的应用过(只是把读和写在程序级别进行了分离),这篇文章是我最近几天的思考,写下来希望大家多提意见。这篇文章不会涉及Command端的设计,重点关注如何设计查询。
真心的希望大家看完后能给出你们的意见和想法。
什么是CQRS
CQRS:Command Query Responsibility Separation。我喜欢职责分离,这也是我采用这种架构的原因,确实能带来单一职责的优点。
简单的CQRS
复杂的CQRS
CQRS的常见查询需求
下面是系统的一些查询需求:
查询面板
高级查询
数据行级别的权限
如:个人、部门、分公司、品种。
固定约束
如:启用、合法、租户ID。
需求总结
CQRS的查询设计
充分利用SQL和动态类型的优势,不做太多无谓的封装。
关键决策:
-
- 直接查询数据库返回Dynamic类型,不需要定义强类型。
- 直接用SQL,支持动态查询面板和动态数据行权限。目前没有找到封装SQL的理由,最多是在外围再封装一层,但是不会隐藏SQL(我之前写过一个简单的查询对象)。
- 利用一些策略防止SQL注入和权限提升(这篇文章不介绍)。
示例代码
下载地址:http://happy.codeplex.com/SourceControl/latest。
AJAX程序
Ext.onReady( query = TableOrViewName: 'Users' WhereClause: "Name NOT LIKE '%段%'" url: 'TestDynamicQuery/Fetch' method: 'POST' success: query = TableOrViewName: 'Users' WhereClause: "Age >= 20 AND Age <= 27" url: 'Tes…………………………………………………………………………