using MediatR; using System.Threading; using System.Threading.Tasks; namespace Kean.Domain { /// /// 命令处理程序 /// /// 命令模型 public abstract class CommandHandler : ICommandHandler where T : class, ICommand { private T _command; // 命令实例 /* * 隐藏接口 MediatR.IRequestHandler.Handle,表示命令处理 * 将实际处理程序转移到 Kean.Domain.ICommandHandler.Handle 方法 * 为了去掉返回值 MediatR.Unit,因为业务中用不到 */ async Task IRequestHandler.Handle(T request, CancellationToken cancellationToken) { // Command 不一定都继承 Kean.Domain.CommandValidator,如果继承则在此执行 Validate,结果交给实际业务处置,更灵活 if (request is CommandValidator validator) { validator.Validation(); validator.Validate(); } await Handle(_command = request, cancellationToken).ConfigureAwait(false); return Unit.Value; } /* * 抽象实现接口 Kean.Domain.ICommandHandler.Handle,表示命令处理 * 覆盖了 MediatR.IRequestHandler.Handle */ public abstract Task Handle(T command, CancellationToken cancellationToken); /// /// 命令输出 /// /// 属性名 /// 输出值 protected void Output(string property, object value) => typeof(T).GetProperty(property).SetValue(_command, value); } }