Node.js 开源论坛

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

如果放在event handle里可以写成:


handle1.eventName = "Reply.*.create"; // 监听这个事件
function handle1(reply){
...
my.repos.Topic.get(reply.topicId,function(topic){
topic.addReply(reply.parentId, reply.id);
})
...
}

在说一下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();
}

先说到这里,cqrs中规范了很多可用工具,灵活且强大,要灵活应用就要不拘一格,根据自己实际需要来发挥其潜力。


[该贴被brighthas于2014-01-27 04:06修改过]

今天说一下,我对领域层和应用层理解。

领域层我们可以抽象成一个 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];
}

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

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

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

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

今天说到这里。

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