2012-09-26 28 views
3

我想知道在保存模型之前验证模型的最佳方法以及优缺点。 我在服务层和IValidatableObject之间存在疑问。使用服务层或IValidatableObject

服务层:

public class PersonService 
{ 
    public void Insert(Person person) 
    { 
     if (!IsValid(person)) 
     { 
      //something 
     } 
    } 
} 

IValidatableObject:

public class Person:IValidatableObject 
{ 
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!IsValid(this)) 
     { 
      //something 
     } 
    } 
} 

回答

9

IValidatableObject通常用于自验证实体,即验证被限制为检查的Person属性。

自我确认(例如IValidatableObjectDataAnnotations)对于'初始'检查是有用的,例如,在用户界面,以确保用户已填写所有必填字段,并广泛地满足像正则表达式匹配,字符串长度,日期范围等

为了验证规则,以保持您的系统的其余部分分离的Person实体,您将无法在自我验证中执行更高级的业务规则,这些规则需要往返数据库或使用外部系统的服务呼叫。相反,在服务/业务/管理器层上进行的验证通常用作交易的一部分,例如,插入/更新/状态转换,并且这可以进行更多的涉及验证,例如,

  • 它可以检查其他业务规则,这确实需要在Person实体不能立即获得的信息(即从数据库中获取相关的数据,消费等Web服务等,使得验证决策时)。这里的一个例子就是确定一个银行账户是否有可用资金,或者一天中是否有超过10次提款。
  • 验证特定于国家的规则,例如插入或更新人员时可能会应用不同的规则,或者如果人员活着或死亡,则可能适用不同的规则。这种附加的上下文可能不适用于自我验证。
  • 但是,服务/业务层检查仍可以使用自我验证(例如person.Validate())(包括使用IValidatableObject)来防止重复规则。
+0

不错,所以,如果我使用数据注解的接口IValidatableObject实际上没用是不是? – MuriloKunze

+2

@murilokunze我不会说 - 数据注释和IValidatableObject.Validate对表示层非常有用(例如MVC ModelState与这些集成),也可以用于EF。它只是服务层验证通常对上下文和状态更具“特定性”。 – StuartLC