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);
}
}