【发布时间】:2016-07-03 02:45:10
【问题描述】:
我正在设计库,它应该可以帮助我在未来的项目中设计域。我制作了一些基本的值对象,例如 EmailAddress 或 PhoneNumber。这些很容易。当这样的值对象可能有不同的规则集来说明它是否有效时,它开始对我产生问题。
让我们在这里以Password 为例,因为这是我写这个问题的真正原因。在以前的项目中,我在Password construtor 中验证了密码规则集。但它使这个实现项目具体化,并且违反了 - 我认为 - 关注分离原则。
我认为 Strategy Patten 是这里的解决方案。但是以这种方式构建这样的 VO:new Password("123456", new AwfullyLoosePasswordValidationStrategy()) 对我来说听起来很糟糕。我也在考虑 VO setValidationStrategy(PasswordValidationStrategy strategy) 中的静态设置器,但这仍然违反关注点分离,对我来说听起来很奇怪。
所以响应的第一部分是——我认为——密码应该只做基本的健全性检查,比如isNullOrEmptyString,仅此而已。但是我什么时候应该进行适当的验证?在实体创建期间?在坚持服务层的某个地方之前?实体想法对我来说听起来并没有那么糟糕,但是setPassword(Password password) 如何知道我想使用的策略?我尽量避免在我的项目中使用单例,几乎所有事情都是通过 DI 完成的。
tl;dr:我应该在哪里验证无法在其构造函数中验证的值对象?
【问题讨论】:
-
好吧,我建议您在创建实体之前进行验证。不创建包含错误内容的内容更容易(相对于允许创建它;然后处理您现在必须处理的特殊情况)。您也可以考虑验证两次(例如直接在某些网页中进行验证 - 您可以在此处知道所提供的密码无效;当然这会导致代码重复)。
标签: java validation domain-driven-design value-objects