WebAPI 2 和 Fluent 验证 - 利用 RuleSet
WebAPI 2 & Fluent validation - leverage RuleSet
我正在开发 Web API 应用程序,利用 FluentValidation
、AutoMapper
和 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 并创建单独的验证器 - 但我想创建 unnecessary/duplicated/boilerplate 代码。
- 在操作中使用控制器手动实例化验证器——基于条件,指示规则集并手动调用验证——但这伪造了整个 IoC 设置和抽象。
请指教
例如,如果您的实体具有自动生成的 ID(身份),您可能可以依赖 DTO 的 ID 来检查您的实体是新的(未设置 ID)还是即将更新(将设置 id)并根据使用 "When" or "Unless" 方法构建验证规则。
其他选项是您的 DTO 将有一个描述您要执行的操作的状态,因此添加、更新、删除和未更改,并使用 [=10 围绕该状态构建验证规则=] 方法。
希望对您有所帮助。
我正在开发 Web API 应用程序,利用 FluentValidation
、AutoMapper
和 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 并创建单独的验证器 - 但我想创建 unnecessary/duplicated/boilerplate 代码。
- 在操作中使用控制器手动实例化验证器——基于条件,指示规则集并手动调用验证——但这伪造了整个 IoC 设置和抽象。
请指教
例如,如果您的实体具有自动生成的 ID(身份),您可能可以依赖 DTO 的 ID 来检查您的实体是新的(未设置 ID)还是即将更新(将设置 id)并根据使用 "When" or "Unless" 方法构建验证规则。
其他选项是您的 DTO 将有一个描述您要执行的操作的状态,因此添加、更新、删除和未更改,并使用 [=10 围绕该状态构建验证规则=] 方法。
希望对您有所帮助。