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修改过]