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

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

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

有帮助吗?

解决方案

这种事情通常在(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);
    }
  }
}

其他提示

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

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

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

你应该避免的五个简单的数据库设计错误

参见第4节:

  

通过应用程序实施完整性

     

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

     

解决方案很简单。

     

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

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

马克

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top