Nodejs JSDM框架,用于DDD,CQRS,Domain开发。

Nodejs JSDM框架,用于DDD,CQRS,Domain开发。

JSDM链接地址

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


2 回复

Nodejs JSDM框架,用于DDD、CQRS、Domain开发

JSDM链接地址

JSDM

JSDM简介

JSDM是一个专为Node.js和浏览器设计的领域驱动开发(DDD)和命令查询职责分离(CQRS)框架。它提供了一个组件化的架构,使开发者能够轻松地构建复杂的业务逻辑。

安装

通过npm安装

npm install jsdm

通过Component安装

component install brighthas/jsdm

领域(Domain)是什么?

领域是一个黑盒子,外部操作必须使用domain.exec函数来执行。领域内部包含聚合(Aggre)、事件处理器(EventHandle)、服务(Service)和命令处理器(CommandHandle)。

领域执行流程:

  1. domain.exec
  2. 命令处理器(Command Handle)
  3. 服务或聚合对象(生成事件)
  4. 事件处理器(处理事件)

示例代码

步骤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原则的应用程序。

回到顶部