Node.js 開源論壇

brighthas發表於2014-01-27
Node.js 開源論壇

Node.js 開源論壇採用JSDM框架開發 , JSDM的誕生得益於我在jdon的薰陶。JSDM是node.js的CQRS DDD 框架的實現。開源論壇的領域層基本完成

http://github.com/brighthas/forum

下面說一下開源論壇領域層的開發。

我劃分出一些 aggre :

使用者 user

私信 message

欄目 column

主題 topic
topic有一個replyTree是為了表示此主題reply的關係,是個樹結構。只記錄相關的reply id。

回帖 reply

下面透過建立reply說明 cqrs的好處。

當有create a reply event 時,會呼叫 對應 topic.appReply(parentid,replyid) 新增的是reply id , parentis 是 reply的父reply,可有可無。

這個程式碼可以放在 command handle裡,這個程式碼也可以放在 event handle裡寫,cqrs的靈活就是透過核心domain的event來寫擴充套件logic

handle3.commandName = "create a reply";

function handle3(args, callback) {
    my.services.postReplyCheck(args.authorId, function(pass) {
        if (pass) {
            my.repos.Reply.create(args, function(err, reply) {
                if (reply) {
                    my.repos.Topic.get(reply.topicId, function(topic) {
                        // 新增對應的id關係到topic,這個程式碼也可以放在 event handle裡
                        topic.addReply(reply.parentId, reply.id);
                    })
                }
            });
        }

    });

    callback();
}

<p class="indent">


如果放在event handle裡可以寫成:

handle1.eventName  = "Reply.*.create"; // 監聽這個事件
function handle1(reply){
     ...
    my.repos.Topic.get(reply.topicId,function(topic){
          topic.addReply(reply.parentId, reply.id);
    })
     ...
}
<p class="indent">


在說一下repository

每個aggre對應一個repository物件,比如topic對應的repository程式碼如下:需要實現3個方法

    // doman/repos.js

    // 建立一個repository
    var topicRepo = new my.Repository("Topic");

    // 實現生成方法,jsdm框架內部呼叫它
    topicRepo._create = function (args, callback) {
        var Topic = my.Aggres.Topic;
                var topic = new Topic(args);
                if(topic.hasError()){
                        callback(topic.errors);
                }else{
                callback(null, topic);
                }
    }
  
    // json資料 -> aggre物件  ,jsdm框架內部呼叫
    topicRepo._data2aggre = function (data) {
        var Topic = my.Aggres.Topic;
        return Topic.reborn(data);
    }

    // aggre -> json  , jsdm框架內部呼叫
    topicRepo._aggre2data = function (aggre) {
                return aggre.toJSON();
    }

<p class="indent">


先說到這裡,cqrs中規範了很多可用工具,靈活且強大,要靈活應用就要不拘一格,根據自己實際需要來發揮其潛力。


[該貼被brighthas於2014-01-27 04:06修改過]

相關文章