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