Node.js 开源论坛

14-01-27 brighthas
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修改过]

brighthas
2014-02-07 10:58
今天说一下,我对领域层和应用层理解。

领域层我们可以抽象成一个 domain域 , 是个黑匣,你只能通过 exec / call 进行调用,通过on / once 方法监听 domain内部的事件。

domain 内部不包括任何持久化,持久化代码也是放在domain之外的,例如nodejs开源论坛的持久化代码在 app/eventHandle.js 里,而不是在domain/eventHandle.js 里。

var dbs = require("./db");

module.exports = wrap;

function wrap(my){

    handle1.eventName = "*.*.create";

    function handle1(className,data){
		var db = dbs.getDB(className);
		db.create(data,function(err){

		})
    }

	handle2.eventName = "*.*.update";
	function handle2(className,id,data){
		var db = dbs.getDB(className);
		db.update({id:id},data,function(){})
	}

	handle3.eventName = "*.*.remove";
	function handle3(className,id){
		var db = dbs.getDB(className);
		db.remove({id:id},function(){});
	}
    return [handle1,handle2,handle3];
}
<p class="indent">


通过监听 create/update/remove 的domain内部事件来进行持久化。

然后通过 domain.register 方法注册即可。

domain层只包括最核心的代码,而应用层是一个具有判断力的一层。非常有趣的是领域层相当于人的潜意识是显意识的30000倍,但没有判断力,无条件的接受,这也就是领域层不会把“人”考虑进来。而应用层相当于人的显意识,具有判断力,通过它才能进入潜意识(领域层)。

领域层并不包括验证码判定和路由的概念,这里需要你对DDD深刻理解后,才能划分好。

今天说到这里。

[该贴被brighthas于2014-03-12 22:01修改过]