34 | MediatR:轻松实现命令查询职责分离模式(CQRS)
实际上我们在定义我的查询的时候,也可以这样定义,例如我们定义一个 MyOrderQuery,把订单的所有名称都输出出去
namespace GeekTime.API.Application.Queries
{public class MyOrderQuery : IRequest<List<string>>{public MyOrderQuery(string userName) => UserName = userName;public string UserName { get; private set; }}
}
我们再定义一个查询器,这里就可以从各种地方查询到我们的数据然后返回出去
namespace GeekTime.API.Application.Queries
{public class MyOrderQueryHandler : IRequestHandler<MyOrderQuery, List<string>>{public Task<List<string>> Handle(MyOrderQuery request, CancellationToken cancellationToken){return Task.FromResult(new List<string>());}}
}
实际上我们这样子就完成了查询和查询处理的定义
我们可以在 Controller 定义
[HttpGet]
public async Task<List<string>> QueryOrder([FromBody]MyOrderQuery myOrderQuery)
{return await _mediator.Send(myOrderQuery);
}
这样就完成了查询和查询处理逻辑的分离
我们执行命令是同样的实现方式,我们这样子做的话可以将我们的查询的输入和处理定义在一个目录下面,也可以将我们的命令的定义和命令的执行放在一个目录下面,使我们的 Controller 关注于身份认证或者基础设施缓存等等一些逻辑的处理,它不再关心说我的业务逻辑是怎么样子的