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