3

我希望这不是非常主观的,但是在验证业务逻辑时,我看到了两条路径,除非我弄错了,否则它们会提供几乎相同的结果:

在第一种情况下,模型是数据的哑容器,在第二种情况下,模型知道其有效状态。除此之外,我错过的两者之间是否存在细微差别?在某些情况下是否应该使用其中一种?

谢谢,

克里斯

4

2 回答 2

3

在我看来,您可以使用 Data Annotations 或Fluent Validation在您的模型(InputModel)上保留基本验证(必填字段、正则表达式字段、比较字段等),并在服务层中进行业务验证。我认为注释更多的是创建屏幕验证和服务器端的输入,而不是业务验证。如果您将业务保留在服务层,您必须记住创建一个ModelStateWrapper 以将其与 Asp.Net MVC 集成,并将其显示在视图上。

看一下 ModelState Wrapper 的同一个:

public class ModelStateWrapper : IValidationDictionary
{
   private ModelStateDictionary _modelState;
   public ModelStateWrapper(ModelStateDictionary modelState)
   {
      _modelState = modelState;
   }

   #region IValidationDictionary Members

   public void AddError(string key, string errorMessage)
   {
      _modelState.AddModelError(key, errorMessage);
   }

   public bool IsValid
   {
      get { return _modelState.IsValid; }
   }

   #endregion
}
于 2012-11-05T15:47:14.997 回答
1

它们不是相互排斥的,您可以将属性用于“静态”规则,并将服务层验证用于“动态”规则(例如检查唯一性)。

引用您提到的教程:

在本教程中,您将学习如何将验证逻辑从控制器中移出并移到单独的服务层中。

好吧,用数据注释属性修饰的模型不必在控制器旁边的 Web 项目中,它可以在服务旁边的服务层中,这意味着所有验证逻辑都在一个地方。

于 2012-11-05T15:53:11.640 回答