我有一个关于实体验证的问题。例如,有一个
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
。以这种方式明确显示规则在域中,使其更具表现力。
那么问题是:您对这种方法有何看法?还有其他解决方案吗?