当我使用存储库模式时,我在哪里放置业务逻辑?

时间:2009-10-24 18:21:30

标签: repository-pattern

我正在为我的应用程序使用Repository Pattern。我有一个类用户。用户通过电子邮件识别。 UserRepository包含方法CreateUser(用户用户)。有一条业务规则说用户应该拥有唯一的电子邮件。

我想实现一个事务,首先检查电子邮件是否正在使用,如果没有,则创建用户。 我应该在哪里放置负责检查电子邮件唯一性的代码?

这绝对是一项商业规则;这是商业逻辑。我认为将此检查放在我的UserRepository实现中是不正确的。

4 个答案:

答案 0 :(得分:6)

这种事情通常在(1)服务或(2)作为数据库约束(并且经常两者)直接进入模式。

使用服务,您不直接从客户端代码访问存储库;你打电话给你做有用的操作。

例如:

public class UserService : ... {
  private Repository<User> _userRepository;

  public void CreateUser(User u) {
    // Verify that the user's email is unique.
    if ( ... ) {
      _userRepository.Create(u);
    }
  }
}

答案 1 :(得分:2)

如果你正在构建一个足够大的应用程序以便repository pattern,那么你将希望将此验证尽可能接近数据,可能是数据库约束,例如唯一索引/键。这可以防止由于数据损坏而导致错误泄漏到代码中的情况。

答案 2 :(得分:0)

假设您正在使用数据库进行存储,您绝对应该在数据库的电子邮件列中添加唯一约束。

答案 3 :(得分:0)

查看关于Simple Talk的优秀文章:

Five Simple Database Design Errors You Should Avoid

参见第4节:

  

通过应用程序实施完整性

     

基于申请的支持者   诚信通常认为   约束对数据产生负面影响   访问。他们也有选择地假设   根据需要应用规则   申请是最好的途径   采取。 .....

     

解决方案很简单。

     

依靠别人提供   完整性和正确性,除了   数据库本身。没什么,我   既不是用户也不是应用   在数据库外部。**

因此,在您的情况下 - 您的电子邮件列上的唯一约束应该真正在数据库中建模。这是放置这一业务逻辑的最佳位置,从长远来看,这将使您免于悲痛。

马克