我一直在构建具有流利验证的API。我正在研究项目的初始结构。当我向项目中添加更多开发人员时,我需要强制他们为每个模型类实现Fluent Validation类。
当前,当存在验证时验证有效。但是,当没有验证存在时,它不会抛出错误。没有验证类时,有什么办法可以实现编译错误?就像在查询处理程序类上具有抽象函数来检查验证。
public abstract class CommandHanlder<TCommand> : IRequestHandler<TCommand, ICommandResult> where TCommand : IRequest<ICommandResult>
{
protected IDbContext DbContext { get; }
public TCommand Command { get; private set; }
protected CommandHanlder(IDbContext dbContext)
{
DbContext = dbContext;
}
public async Task<ICommandResult> Handle(TCommand request, CancellationToken cancellationToken)
{
CheckValidation();
Command = request;
ICommandResult commandResult;
commandResult = await Execute();
return commandResult;
}
protected abstract Task<ICommandResult> Execute();
protected bool CheckValidation()
{
// Need to check whether validation present else should throw a compilation error
return true;
}
}
答案 0 :(得分:1)
这取决于您的设置方式。通常,您将受到基类的相当大的限制,因为它只会对自身具有可见性,而不是对它派生的类。您可以添加一个抽象的属性或方法,但这只能确保它是“实现的”,而不是正确实现的。例如,假设您要强制开发人员通过使其抽象来实现CheckValidation
。派生类中的以下内容将满足:
protected override bool CheckValidation() => true;
显然没有解决任何问题。
最终,如果您要通过合成提供某些验证类,则最好将其注入基类:
public abstract class CommandHanlder<TCommand> : IRequestHandler<TCommand, ICommandResult>
where TCommand : IRequest<ICommandResult>
{
protected readonly IValidationClass _validationClass;
protected CommandHandler(IValidationClass validationClass)
{
_validationClass = validationClass ?? throw new ArgumentNullException(nameof(validationClass));
}
...
}
然后,派生类将需要提供类似的构造函数:
protected MyDerivedCommandHandler(MyValidationClass validationClass)
: base(validationClass)
这将确保如果未传递IValidationClass
的某些实现,则将引发异常。
简短的代码审查(也许比这更好)。应该有一个构建和发布管道。合并到master /您的发布分支应通过请求请求完成,而这些请求应要求一个或多个审阅者。如果有人添加了一个没有“验证”的类,那么您可以拒绝请求请求,然后将其发送回开发人员进行修复。