Skip to main content

命令

命令是一个携带业务参数信息及处理结果返回的载体,连接着请求和聚会根的桥梁。处于内敛目的,聚会根内的所有业务方法入口都是通过命令调用触发的。

代码结构上,命令的位置属于应用层(application)。

特性
  • 命令具有语义性,统一由命令网关 CommandGateway 发送
  • 命令会影响聚会根的业务数据和生成领域事件
  • 一个命令的执行过程只保证当前聚会根数据的原子性

命令的定义

为了规范,Qiqb 提供了标准命令,但是标准命令定义麻烦,所以又提供了内部命令。这两种方式看读者爱好自行选择。

标准命令

标准命令是以命令为中心,直接主动调用聚会根方法。这种写法最符合领域驱动的分层结构,domain始终在最底层。 示例:


@Cmd(User.class)// 定义这个命令需要操作的聚会根
public class UserCreateCmd implements CommandResult<String> {

private final String name;

@Setter
private int age = 18;

/**
* 新增的用户ID
*/
private String userId;// 外部需要的结果信息

public UserCreateCmd(String name) {
this.name = name;
}

@FetchHandler // 获取聚会根
public User create() {
User user = new User(name, age);
userId = user.getId();
return user;
}

@BizHandler// 处理业务逻辑
public void handle(User user){
}

@Override
public String result() {
return userId;
}
}

标准命令是一个特殊的类,并且需要把这个类扫描到配置中。这个类

内部命令

内部命令是以聚会根为中心,聚会根直接接受命令作为第一个参数。这种写法简洁,但是聚会根引用了application 层命令类,破坏了分层结构。如果读者接受这种瑕疵,可以这样简单定义。

示例:

@Getter
public class UserCreateInnerCmd {

private final String name;

@Setter
private int age = 18;

public UserCreateInnerCmd(String name) {
this.name = name;
}

}

@CommandHandler//标明此构造器可直接接受用户创建命令
public User(UserCreateInnerCmd createCmd){
this(createCmd.getName(),createCmd.getAge());
}

内部命令是一个普通的对象,可以是java基本类型。

命令执行流程

根据命令获取响应的聚会根对象,

创建命令

修改命令