演示cqrs+actor的用法

brighthas 14-11-20
         

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;
}
}
})