【问题标题】:MVC Validation: Service Layer or Data AnnotationsMVC 验证:服务层或数据注释
【发布时间】:2012-10-25 11:09:57
【问题描述】:

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

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

谢谢,

克里斯

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 model-view-controller


    【解决方案1】:

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

    看一下ModelState Wrapper的同一个pl:

    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
    }
    

    【讨论】:

    • 有意义,验证可以使用数据注释隔离检查的属性,并验证通过服务层与其他组件集成的其他规则。一旦有人指出,这很容易:)
    【解决方案2】:

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

    引用您提到的教程:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多