演示cqrs+actor的用法

14-11-20 brighthas
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();

    }
});
<p>

下面是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;
        }
    }
})
<p>
         

猜你喜欢