WebAPI 2&流畅的验证 - 利用RuleSet

时间:2015-12-10 17:36:02

标签: c# validation asp.net-web-api2 autofac fluentvalidation

我正在开发一个Web API应用程序,利用FluentValidationAutoMapper以及AutoFac。我有基本设置,一切都按预期工作。验证是透明地执行的,在控制器中我可以检查它是否有效:

    [Route("")]
    [HttpPost]
    public HttpResponseMessage PostDinnerList(DinnerListDTO newDinnerList)
    {
        if (!ModelState.IsValid)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
        var dinnerList = _mapper.Map<DinnerList>(newDinnerList);
        dinnerList.Owner.Token = _userService.GetUserToken();
        dinnerList = _dinnerListRepository.InsertDinnerList(dinnerList);
        var newDinnerListDto = _mapper.Map<DinnerListDTO>(dinnerList);
        return Request.CreateResponse(newDinnerListDto);
    }

当我通过DTO并将其保存到数据库中时,这没关系。但是,我想利用与规则集相同的验证器来区分何时创建新条目以及何时将其编辑为不同的规则。

我看到在FluentValidation的MVC版本中,CustomizeValidatorAttribute可用,并且可以使用它选择规则集。在WebAPI版本中没有类似的东西。

我在想如何解决这个问题。理想情况下,我希望有两个操作:new / update,并使用相同的验证器,并指出应该使用哪个规则集。

我想到的解决方法:

  • 在编辑操作上使用不同的DTO而不是新操作并创建单独的验证器 - 但我想创建不必要的/重复的/样板代码。
  • 在操作中使用控制器手动实例化验证器 - 基于条件,指示规则集并手动调用验证 - 但这会伪造整个IoC设置和抽象。

请告知。

1 个答案:

答案 0 :(得分:2)

  1. 如果您的实体具有自动生成的ID(标识),您可以依赖DTO的ID来检查您的实体是否是新的(没有ID设置)或者它即将更新(将设置id)并根据使用"When" or "Unless"方法的验证规则构建验证规则。

  2. 其他选项是您的DTO将具有描述您要执行的操作的状态,因此已添加,更新,已删除和未更改,并使用"When" or "Unless"方法围绕该操作构建验证规则。

  3. 希望这有帮助。