DataAnnotations或在服务中手动验证?

Mar*_*tin 9 validation asp.net-mvc three-tier

每次我开始处理新的ASP.NET MVC Web应用程序时,我都不确定是否使用DataAnnotations验证.关于它的事情感觉不对.

例如,假设我有UserService一个CreateUserModelCreate动作传递的AccountController.为确保用户始终提供名称,我将模型的Name属性设置为具有该[Required]属性.我现在安全地知道模型活页夹CreateUserModel除非有名字,否则不会给我一个.

我的问题是,为了UserService成为我系统的可重用组件,它不能依赖上面的层提供有效数据的事实,当然还必须验证这些数据.当您考虑要编写完全重用UserService(并且不会使用模型绑定器对其进行所有数据注释验证)的Web服务时,对此的需求会进一步突出显示.

所以我的问题是:这种情况的最佳做法是什么?使用数据注释进行验证并在服务中重复该验证?仅在服务中验证并抛出异常?两者兼而有之?

我希望我的问题不是太主观,我主要是试图就是否最终将验证转移到数据注释上达成共识.

Kal*_*exx 7

我使用手动验证(如果x == y)和使用数据注释的组合在服务层执行所有验证.

要在服务层中使用数据批注,您必须使用该方法手动使用ValidatorTryValidateObject().这里可以看到一个很好的例子.

然后,您必须将验证错误从服务层传递到控制器,并让控制器将每个错误添加到模型状态错误列表中.


Max*_*oro 1

你是对的,你应该禁用控制器上的验证并在服务层中进行验证。如果您愿意,您仍然可以使用 DataAnnotations。服务层可以抛出带有验证消息的异常,控制器可以捕获该异常并将验证消息添加到 ModelState。您可以通过处理控制器的 OnException 方法上的验证异常来避免对每个操作执行此操作。