大家好,我是利奥brighthas,下面介绍一下 node.js 的 CQRS框架[ JSDM ]参看项目
https://github.com/brighthas/jsdm
以前我开发过cqrsnode是纯粹CQRS的框架,后来工作室本身需要开发相对复杂的系统,而且要浏览器也要有很好的抗“复杂性”,所以我改版成 JSDM。
JSDM不是完全传统的CQRS DDD框架,以下说明一下。
// 这是伪代码,不是完整的,只是说明一下基本用法
var domain = require("jsdm")();
domain
.bindAgg(...)
.bindCommandHandle(...)
.bindService(...)
.listen(...)
.bindAgg(...)
.bindDB(db)
....
.seal(); // 封印
// 封印后,只剩下如下三个方法有效。
// on / once 是 监听器,从domain外部监听内部,但数据都是只读的,改变 domain内部状态只能通过exec方式执行 command来操作 domain内部。
domain.on(...);
domain.once(...);
domain.exec(...); // 执行 command ,对应着 command handle.
<p>
|
这里需要说明的是 domain.bindDB(db) 这里的db只有一个 get(id,callback) 方法,开发者可以自己实现一个get方法即可, jsdm不是传统的 CQRS ,去除了传统的 event store 的回溯的功能。目的是提供中小型项目也能快速开发的目的,并享受CQRS的精华机制。
那么, db.get 只有这个方法, update 、 remove 、 save呢?
在domain的内部,当 new XXXAggre() 一个根的实例时,会触发一个 create event, 相应的还有 update / remove 的事件产生,而domain new一个Aggre时,会先存放在 cache 中。只有从Repository 得到 Aggre实例时,会先从cache找,如果没有会调用 db.get 方法并放入 cache然后回调出来。
remove 、 update 、 save 实现很简单。
domain
.listen("create",function(event){
// 当然实现非常简单,可以使用内存、file 、mysql,一切都可以。
testdb.save(event.aggreType,event.data);
})
.listen("update",function(event){
testdb.save(event.aggreType,event.data);
})
.listen("remove",function(event){
testdb.remove(event.aggreType,event.data);
})
<p>
|
另外如果想实现事件的store,直接 domain.listen(" * " ... ) 监听 * 号,表示监听全部事件。
domain.listen("*",function(event){
// save event object.
})
<p>
|
如果项目很复杂,可以使用多个 domain
var domain1,domain2 ..... , domain n
<p>
|
[该贴被brighthas于2013-02-20 10:52修改过]