Nodejs JSDM框架,用于DDD,CQRS,Domain开发。
Nodejs JSDM框架,用于DDD,CQRS,Domain开发。
JSDM
Domain development , DDD-CRS framework for node.js and browser’s component/component framework .
Node.js Install
npm install jsdm
Component Install
component install brighthas/jsdm
domain mean?
domain is a black box , outside operate must use domain.exec function.
domain inside include Aggre, EventHandle, Service and CommandHandle.
domain.exec —> command handle —> serivce / Aggre object (generate events) —> event handle
step 1. define Aggre
// User.js
module.exports = {
name:"User",
init:function(data,callback){
var err = null;
var mydata = {
name:data.name
}
callback(err,mydata);
},
proto:{
updateName:function(args,my){
var name = args.name;
my.data("name",name);
my.publish("updateName",{name:name});
}
}
}
step 2. define command handle
// commandHandles.js
module.exports = [{
name: "create a user",
handle: function(args, callback, my) {
var User = my.getAgg("User");
User.create({name: args.name},function(err,user){});
}
},
{
name: "update user name",
handle: function(args, callback, my) {
var User = my.getAgg("User");
User.get(args.userId,function(user){
user.updateName({name:args.name});
})
}
}]
step 3. database interface
// jsdm core only need 'get' function, from database get obj data , the data is json.
// testdb.js
module.exports = {
_dbs = {
User:{
'id001':{name:'brighthas'}
}
},
// typename is aggre type name, example 'User'.
get:function(typename,id,callback){
if(this._dbs[typename] && this._dbs[typename][id]){
callback(null,this._dbs[typename][id]);
}else{
callback(null);
}
}
}
step 4. create domain and run
var domain = require("jsdm")(),
User = require("./User"),
commandHandles = require("./commandHandles"),
db = require("./testdb");
domain.bindAgg(User)
.bindCommandHandle(commandHandles[0])
.bindCommandHandle(commandHandles[1])
//.bindService(service)
//.listen(eventName,handle)
//.listenOnce(eventName,handle)
//.seal()
.on("User.*.updateName",function(event){
console.log(event.data.name);
});
domain.exec("update user name",{userId:"id001",name:"leo"},function(){});
// execute result is : leo
Nodejs JSDM框架,用于DDD、CQRS、Domain开发
JSDM链接地址
JSDM简介
JSDM是一个专为Node.js和浏览器设计的领域驱动开发(DDD)和命令查询职责分离(CQRS)框架。它提供了一个组件化的架构,使开发者能够轻松地构建复杂的业务逻辑。
安装
通过npm安装
npm install jsdm
通过Component安装
component install brighthas/jsdm
领域(Domain)是什么?
领域是一个黑盒子,外部操作必须使用domain.exec
函数来执行。领域内部包含聚合(Aggre)、事件处理器(EventHandle)、服务(Service)和命令处理器(CommandHandle)。
领域执行流程:
domain.exec
- 命令处理器(Command Handle)
- 服务或聚合对象(生成事件)
- 事件处理器(处理事件)
示例代码
步骤1:定义聚合(Aggre)
创建一个用户聚合(User):
// User.js
module.exports = {
name: "User",
init: function(data, callback) {
var err = null;
var mydata = {
name: data.name
};
callback(err, mydata);
},
proto: {
updateName: function(args, my) {
var name = args.name;
my.data("name", name);
my.publish("updateName", { name: name });
}
}
};
步骤2:定义命令处理器(Command Handle)
定义两个命令处理器:创建用户和更新用户名:
// commandHandles.js
module.exports = [
{
name: "create a user",
handle: function(args, callback, my) {
var User = my.getAgg("User");
User.create({ name: args.name }, function(err, user) {});
}
},
{
name: "update user name",
handle: function(args, callback, my) {
var User = my.getAgg("User");
User.get(args.userId, function(user) {
user.updateName({ name: args.name });
});
}
}
];
步骤3:数据库接口
定义一个简单的内存数据库接口:
// testdb.js
module.exports = {
_dbs: {
User: {
'id001': { name: 'brighthas' }
}
},
get: function(typename, id, callback) {
if (this._dbs[typename] && this._dbs[typename][id]) {
callback(null, this._dbs[typename][id]);
} else {
callback(null);
}
}
};
步骤4:创建领域并运行
var domain = require("jsdm")(),
User = require("./User"),
commandHandles = require("./commandHandles"),
db = require("./testdb");
domain.bindAgg(User)
.bindCommandHandle(commandHandles[0])
.bindCommandHandle(commandHandles[1]);
domain.on("User.*.updateName", function(event) {
console.log(event.data.name);
});
domain.exec("update user name", { userId: "id001", name: "leo" }, function() {});
// 执行结果将输出:leo
以上就是如何使用JSDM框架进行领域驱动开发的基本步骤。通过这些步骤,你可以构建出具有复杂业务逻辑的应用程序,并且可以轻松地管理和维护你的代码。
Nodejs JSDM框架,用于DDD,CQRS,Domain开发
摘要
JSDM 是一个用于领域驱动设计(DDD)、命令查询职责分离(CQRS)的Node.js框架。它通过组件化的结构支持复杂的领域逻辑,并且可以在Node.js和浏览器环境中使用。
安装
从npm安装:
npm install jsdm
使用component安装:
component install brighthas/jsdm
domain 是什么?
domain
是一个黑盒,外部操作必须使用domain.exec
函数。domain
内部包含聚合(Aggre)、事件处理器(EventHandle)、服务(Service)和命令处理器(CommandHandle)。
domain.exec
-> 命令处理器 -> 服务/聚合对象(生成事件)-> 事件处理器
步骤1:定义聚合(Aggre)
首先创建一个用户聚合:
// User.js
module.exports = {
name: "User",
init: function(data, callback) {
var err = null;
var mydata = {
name: data.name
};
callback(err, mydata);
},
proto: {
updateName: function(args, my) {
var name = args.name;
my.data("name", name);
my.publish("updateName", { name: name });
}
}
};
步骤2:定义命令处理器
接下来定义一些命令处理器来处理具体命令:
// commandHandles.js
module.exports = [
{
name: "create a user",
handle: function(args, callback, my) {
var User = my.getAgg("User");
User.create({ name: args.name }, function(err, user) {});
}
},
{
name: "update user name",
handle: function(args, callback, my) {
var User = my.getAgg("User");
User.get(args.userId, function(user) {
user.updateName({ name: args.name });
});
}
}
];
步骤3:数据库接口
定义一个简单的数据库接口来模拟数据存储:
// testdb.js
module.exports = {
_dbs: {
User: {
'id001': { name: 'brighthas' }
}
},
get: function(typename, id, callback) {
if (this._dbs[typename] && this._dbs[typename][id]) {
callback(null, this._dbs[typename][id]);
} else {
callback(null);
}
}
};
步骤4:创建域并运行
最后,创建域并执行命令:
var domain = require("jsdm")(),
User = require("./User"),
commandHandles = require("./commandHandles"),
db = require("./testdb");
domain.bindAgg(User)
.bindCommandHandle(commandHandles[0])
.bindCommandHandle(commandHandles[1]);
domain.on("User.*.updateName", function(event) {
console.log(event.data.name);
});
domain.exec("update user name", { userId: "id001", name: "leo" }, function() {});
// 执行结果:leo
以上就是使用JSDM框架的基本步骤,通过这些步骤可以构建出遵循DDD和CQRS原则的应用程序。