我们的应用要使用 CQRS 这种架构,在应用里要去做一些事情,可以执行一个命令,比如请求创建用户接口的时候要创建新的用户,这样在接口处理器那里就可以执行一个创建用户的命令。
下面先创建一个命令,在终端,项目所在目录的下面,执行 npm run gc 生成一个命令,名字是 create-user ,把它放在 user/create/commands 这个目录里面。
完成以后回到项目,打开 user/create/commands 里面的 create-user 这个命令,这个命令有个 params 参数,类型是 CreateUserCommandParams,它是一个 interface,在它里面可以添加一个 name ,类型是 string,再添加一个 password ,类型也是 string。
这样在执行 CreateUser 这个命令的时候,需要提供一个 params 参数,它里面要提供 name 还有 password 这两个属性。
执行命令
打开 user-create.controller ,这里之前我们定义了一个创建用户用的演示接口,在这个处理器里面可以执行一下 CreateUser 命令。
首先要在这个控制器里面注入一个 CommandBus,添加一个 constructor ,里面添加一个 private readonly commandBus,类型是 CommandBus。
然后在这个 createUser 方法里面,return 的东西可以执行一个命令,用一下 this.commandBus.execute ,新建一个 CreateUserCommand,提供一个 params 参数,里面有 name,手工设置一下它的值,比如 王皓,还需要一个 password,对应的值是 123123。
处理命令
这样请求这个接口的时候,应用就会执行一个 CreateUser 命令。处理这个命令要使用命令对应的处理器,在 user/create/commands 里面,打开这个 create-user.command.handler ,它是 CreateUser 命令对应的命令处理器。
在这个命令处理器里面,有个 execute 方法,在这个方法里可以处理一下执行的命令。这个方法有个 command 参数,它的类型被设置成了 CreateUserCommand,它里面有个 params 参数。
我们先在这个方法里解构一下,把 name 还有 password,从 command.params 里面解构出来。方法 return 的东西就是处理的结果,可以先用一个字符模板组织一行文字,create user: 后面加上 ${name} 还有 ${password} 。也就是从命令的 params 参数里面解构出来的 name 还有 password 这两个属性的值。
测试
在 Http 客户端测试一下,重新发送一下创建用户这个请求,你会发现这次返回的文字是 create user 然后是用户名还有密码。请求创建用户接口的时候,应用会执行一个 CreateUserCommand 命令,这里我们看到的这行文字就是这个命令对应的处理器返回的东西。