命令
命令是一个携带业务参数信息及处理结果返回的载体,连接着请求和聚会根的桥梁。处于内敛目的,聚会根内的所有业务方法入口都是通过命令调用触发的。
代码结构上,命令的位置属于应用层(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基本类型。
命令执行流程
根据命令获取响应的聚会根对象,