强制其他开发人员进行验证类

时间:2019-07-08 02:37:20

标签: asp.net asp.net-core asp.net-web-api2 abstract-class fluentvalidation

我一直在构建具有流利验证的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;
    }
}

1 个答案:

答案 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 /您的发布分支应通过请求请求完成,而这些请求应要求一个或多个审阅者。如果有人添加了一个没有“验证”的类,那么您可以拒绝请求请求,然后将其发送回开发人员进行修复。