【发布时间】:2012-03-10 12:37:51
【问题描述】:
我有一个与实体验证相关的问题。例如,有一个User 可以注册到给定email 和password 的系统中。商业规则说:
-
email必须有效(必须符合电子邮件格式)且唯一; -
password应介于 6 到 20 个字符之间。
我最初的想法是将验证放在User.Register(email, password) 中。这种方法的主要优点是User 通过验证自己注册数据的正确性来控制它的注册方式。缺点是电子邮件唯一性验证需要调用UserRepository,因此User 可能依赖于它的Repository。为了解决这个问题,电子邮件和密码验证可能会被分解为某种BusinessRule 对象。因此User.Register() 方法中的验证可能如下所示:
var emailValidationErrors = _emailRule.Validate(email);
var passwordValidationErrors = _passwordRule.Validate(password);
_emailRule 和 _passwordRule 可能作为构造函数参数传递:User(EmailRule emailRule, PasswordRule passwordRule).
在这种情况下,User 没有直接耦合到UserRepository。通过这种方式,规则在域中明确显示,使其更具表现力。
所以问题是:您如何看待这种方法?还有其他解决方案吗?
【问题讨论】:
标签: validation domain-driven-design