【问题标题】:Enforce other developers to have a validation class强制其他开发人员有一个验证类
【发布时间】:2019-07-08 02:37:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 的某些实现未传入,则会引发异常。

    除此之外,也许比这更好的是简单的代码审查。应该有一个构建和发布管道。合并到主/您的发布分支应该通过拉取请求完成,并且这些拉取请求应该需要一个或多个审阅者。如果有人在没有“验证”的情况下添加了这样的类,那么您可以拒绝拉取请求,将其发送回开发人员进行修复。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 2013-03-30
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多