我正在为我的应用程序使用Repository Pattern。我有一个类用户。用户通过电子邮件识别。 UserRepository包含方法CreateUser(用户用户)。有一条业务规则说用户应该拥有唯一的电子邮件。
我想实现一个事务,首先检查电子邮件是否正在使用,如果没有,则创建用户。 我应该在哪里放置负责检查电子邮件唯一性的代码?
这绝对是一项商业规则;这是商业逻辑。我认为将此检查放在我的UserRepository实现中是不正确的。
答案 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节:
通过应用程序实施完整性
基于申请的支持者 诚信通常认为 约束对数据产生负面影响 访问。他们也有选择地假设 根据需要应用规则 申请是最好的途径 采取。 .....
解决方案很简单。
依靠别人提供 完整性和正确性,除了 数据库本身。没什么,我 既不是用户也不是应用 在数据库外部。**
因此,在您的情况下 - 您的电子邮件列上的唯一约束应该真正在数据库中建模。这是放置这一业务逻辑的最佳位置,从长远来看,这将使您免于悲痛。
马克