演示cqrs+actor的用法

cqrs for javascript的项目地址: https://github.com/leogiese/cqrs

下面演示一下用法,具体代码可以看项目的 express https://github.com/leogiese/cqrs/tree/master/example

下面是转账类,他是一个saga,同时也是一个actor。


var Actor = require("..").Actor,
shortid = require(
"shortid");

var Transfer = Actor.extend(
"Transfer", {
transfer: function (data, di) {
// 无用代码略

// 监听from id 的用户事件,用自身的handle函数处理
di.listen(
"User." + fromId, "handle");

// 监听to id 的用户事件,用自身的handle函数处理
di.listen(
"User." + toId, "handle");

// 发出领域事件
di.apply(
"transferStart", data);

// 调用 id = fromId 的用户的deduct方法(扣钱)
di.call({typeName:
"User", actorId: fromId, methodName: "deduct", data: {id: tid}});

},

// 这个方法是上文提到的 handle监听器,根据event.name 来分别处理。
handle: function (event, di) {
switch (event.name) {

case
"deduct":
// 当用户发出deduct时间时候的代码
// 以下依次类推,最终监听到 rechargeFinish事件为止,表示整个流程完成。过程中可以都是异步的。
break;
case
"recharge":
// 略
break;
case
"deductFinish":
// 略

break;
case
"rechargeFinish":
di.apply(
"transferSuccess"); // 发出领域事件,表示完成转账。
break;
}
},
// 该方法是内部调用的,自身data数据只能通过 when方法进行修改。
// event表示自身发出的领域事件。
when: function (event, data) {
switch (event.name) {
case
"transferStart":
// 略
break;
case
"transferSuccess":
// 略
break;

}

this.refreshData();

}
});

下面是User 类,也是一个Actor。 不过多解释。一目了然。 cqrs框架有时间我会多些一些文章介绍。


var User = Actor.extend("User", {

recharge: function (data, di) {
// validat code ...
di.apply(
"recharge", data);
},

rechargeFinish: function (data, di) {
// validat code ...
di.apply(
"rechargeFinish", data);
},

deduct: function (data, di) {
// validat code ...
di.apply(
"deduct", data);
},

deductFinish: function (data, di) {
// validat code ...
di.apply(
"deductFinish", data);
},

when: function (event,data) {
switch (event.name) {
case
"create":
// init default data;
data.orderforms = {};
data.money = 100;
break;
case
"recharge":

data.orderforms[event.data.data.id] = event.data.data.money;
break;

case
"rechargeFinish":
var orderforms = data.orderforms;
var money1 = orderforms[event.data.data.id];
data.money = data.money + money1;
delete orderforms[event.data.data.id];
break;

case
"deduct":
var orderforms = data.orderforms;
orderforms[event.data.data.id] = event.data.data.money;
data.money = data.money - event.data.data.money;
break;

case
"deductFinish":
var orderforms = data.orderforms;
delete orderforms[event.data.data.id];
break;
}
}
})