Entity framework 使用服务层或表对象

Entity framework 使用服务层或表对象,entity-framework,Entity Framework,我想知道保存模型之前验证模型的最佳方法是什么,以及利弊。 我对服务层和IValidatableObject之间存在疑问 服务层: public class PersonService { public void Insert(Person person) { if (!IsValid(person)) { //something } } } IValidatableObject: public cl

我想知道保存模型之前验证模型的最佳方法是什么,以及利弊。 我对服务层和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
        }
    }
}
公共类人物:IValidatableObject
{
公共IEnumerable验证(ValidationContext ValidationContext)
{
如果(!IsValid(this))
{
//某物
}
}
}

IValidatableObject
通常用于自验证实体,即验证仅限于检查
人员的属性

自验证(例如
IValidatableObject
和)对于“初始”检查非常有用,例如在用户界面上,以确保用户已填写所有必填字段,并广泛满足验证规则,如正则表达式匹配、字符串长度、日期范围等

为了使您的
人员
实体与系统的其余部分解耦,您将无法在自我验证中执行更高级的业务规则,这需要往返于您的数据库,或者使用对外部系统的服务调用

相反,在服务/业务/管理层上进行的验证通常作为事务的一部分使用,例如插入/更新/状态转换,这可以进行更复杂的验证,例如

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

Nice,那么,如果我使用数据注释,界面IValidatableObject实际上是无用的,不是吗?@murilokunze我不会这么说-数据注释和
IValidatableObject.Validate
对于表示层非常有用(例如,MVC ModelState与这些集成),也可以用于EF。只是服务层验证通常更“特定”于上下文和状态。