【问题标题】:Business rules validation following the DRY principle遵循 DRY 原则的业务规则验证
【发布时间】:2013-06-15 17:17:40
【问题描述】:

背景 - 我通常在实体类本身的属性级别执行验证,使用DataAnnotation 属性或通过实现IValidatableObject 接口。此代码通常无法访问DBContext。

然后,我通常将更复杂的业务规则验证放在服务层中。此类验证的示例包括:检查一个值在数据库中是否唯一,以及检查其他实体值。这些类确实需要DBContext 来查询数据库。

问题 - 我的问题是我最终在服务层中重复了相同的代码。例如,当我插入和更新一个实体时,我会重复相同的代码来检查给定值是否唯一。

我阅读了一些设计模式,例如约束、策略和规范。我想我只需要一点帮助就可以将它们放在一个 EF 分层上下文中。非常感谢。

【问题讨论】:

  • 你有仓库吗?
  • 好吧,当您使用BaseRepository<TEntity> 时,问题似乎可以解决。

标签: c# winforms entity-framework entity-framework-5


【解决方案1】:

我会将验证保留在实体级别。在这里,您可以检查是否设置了所需的属性,它们的值是否正确,您还可以比较实体上的属性。这确保了实体,无论其他实体如何,都处于有效状态。

在服务层中,您可以通过调用 Validate 方法来验证传入该方法的任何实体,还可以与数据库中的实体进行比较。

在验证 ID 是否唯一的实例中,您可以在存储库中添加一个名为 GetById 的方法,通过该方法传入您要检查的实体的 ID,如果它返回 NULL,那么您没有找到实体具有该 ID,因此它是唯一的。

例如:

public class MyRepository
{
  public MyEntity GetById(int id)
  {
    return _entitySet.FirstOrDefault( item => item.Id == id );
  }
}

public class MyService
{
  public void ServiceMethod(Entity entity)
  {
    if( _repository.GetById( entity.Id ) == null)
    {
      // entity.Id is unique!
    }
    else
    {
      // entity.Id is not unique!
    }
  }
}

您的每个存储库都可以访问被管理的实体,例如 Entity Framework 中的 ObjectSet(我认为它被称为),因此您可以安全地将任何共享验证(在特定实体的上下文中)放在存储库。

例如:

public class MyRespository
{
    public bool IsIdUnique(int id)
    {
      Entity entity = _entitySet.FirstOrDefault( item => item.Id == id );
      return entity == null ? true : false;
    }
}

public class MyService
{
  public void ServiceMethod(Entity entity)
  {
    if( _repository.IsIdUnqiue(entity.Id) )
    {
      // entity.Id is unique!
    }
    else
    {
      // entity.Id is not unique!
    }
  }
}

您还可以将 GetById 添加到上面的 MyService 类中,并调用 IsIdUnique 方法,而不是重新键入 lambda。这样您就可以重用 GetById 逻辑。

【讨论】:

    【解决方案2】:

    当您必须访问数据库时,您需要使用 DbContext,而 DbContext 有一个称为 ValidateEntity 的 Overridable 方法。见这篇文章:Entity Framework Validation。

    我把我使用的代码放在另一个答案here

    【讨论】:

      【解决方案3】:

      感谢您的回答,他们非常有见地。我认为这篇文章正确地回答了我的问题。非常感谢。

      http://msdn.microsoft.com/en-us/data/gg193959.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        相关资源
        最近更新 更多