我有一个与DDD中唯一性检查相关的问题。我知道stackoverflow上已经有一些关于这个问题的提问了,但它们并没有真正回答我的疑虑。
在更新/插入数据库时,聚合根是否可以持有仓储(repository)的引用来检查唯一性?还是这项任务由应用程序服务(application service)而非领域模型(domain model)完成?
假设我想检查用户(User)模型的用户名在用户注册时是否唯一。我可以考虑以下几种方法:
- 用户(User)模型引用UserRepository,在Validate()中进行唯一性检查
- 创建一个领域服务(domain service)来进行唯一性检查,使用UserRepository (对我来说这似乎有点奇怪,因为我认为通常只有涉及多个领域模型的情况下才会使用领域服务)
- 在领域层创建一个规约对象(specification object),引用UserRepository来封装唯一性检查规则,并且应用程序服务(application service)层在更新/插入之前使用此对象进行检查。
如果我使用依赖注入(dependency injection),我仍然在思考如何将UserRepository注入到第一种方法中的用户(User)对象、第二种方法中的领域服务(domain service)或第三种方法中的应用程序服务(application service)中,因为在任何情况下,对于用户(User)/领域服务(domain service)/规约对象(specification object),我都需要手动实例化这些对象,所以我似乎唯一的选择是使用IoC中的服务定位器(service locator)来获取实例。但是服务定位器是反模式,所以我想避免使用它。
非常感谢任何样例代码。