Dav*_*d N 10 domain-driven-design dependency-injection specifications unique repository
我有一个关于检查DDD唯一性的问题.我知道在stackoverflow上已经有一些关于这个的问题,但它们并没有真正回答我的疑问
更新/插入数据库时,聚合根是否可以保存存储库的引用以检查唯一性?或者这是应用程序服务而不是域模型完成的任务?
假设我想在用户注册时检查用户模型的用户名是否唯一有几种我能想到的方法:
如果我使用依赖注入,我仍然想知道如何在方法1中将UserRepository注入User,或者在方法2中注入域服务,或者在方法3中注入应用程序服务,因为在任何情况下,对于用户/域服务/规范对象,我需要手动实例化对象,所以我似乎唯一的选择是在IoC中使用服务定位器来获取实例.但服务定位器是一种反模式,所以我想避免它
任何示例代码将不胜感激
我认为检查唯一性属于Repository责任.存储库知道所有聚合,因为它假设模拟域集合,因此很自然地要求Repository具有唯一性(例如,您希望从HashMap中获得).
// repository
interface Users {
// implementation executes SQL COUNT in case of relation DB
bool IsNameUnique(String name);
// implementation will call IsNameUnique and throw if it fails
void Add(User user);
}
Run Code Online (Sandbox Code Playgroud)
从某种意义上说,它是一个漏洞抽象,因为在多用户环境中,这需要在数据存储端强制执行(例如,UNIQUE SQL约束或锁定).
可能不应该从User聚合调用IsNameUnique,我会将此调用移动到Application或Domain Service中,具体取决于应用程序的其余部分的结构.
有关替代方法,请参阅CQRS体系结构中的唯一性验证.