Domain driven design 领域驱动的设计价值对象,如何确保唯一的价值

Domain driven design 领域驱动的设计价值对象,如何确保唯一的价值,domain-driven-design,ddd-repositories,value-objects,Domain Driven Design,Ddd Repositories,Value Objects,我正在创建一个调查问卷。问卷由部分组成,部分由页面组成,页面由问题组成。问卷是聚合根 部分、页面和问题可以有所谓的短代码,短代码在问卷中应该是唯一的(但在数据库中不是唯一的,因此它们不是严格意义上的标识)。我打算将shortcode作为一个值对象,并希望在调查问卷中包含业务规则,即它应该是唯一的,但我不确定如何确保这一点。我的理解是,值对象不应该访问存储库或服务层,那么它如何确定它是否唯一 谢谢你的帮助 Darren显然,您需要在数据库中输入一个PK字段。如何实现这一点取决于您,但如果是我,我会

我正在创建一个调查问卷。问卷由部分组成,部分由页面组成,页面由问题组成。问卷是聚合根

部分、页面和问题可以有所谓的短代码,短代码在问卷中应该是唯一的(但在数据库中不是唯一的,因此它们不是严格意义上的标识)。我打算将shortcode作为一个值对象,并希望在调查问卷中包含业务规则,即它应该是唯一的,但我不确定如何确保这一点。我的理解是,值对象不应该访问存储库或服务层,那么它如何确定它是否唯一

谢谢你的帮助


Darren

显然,您需要在数据库中输入一个PK字段。如何实现这一点取决于您,但如果是我,我会将PK字段带到您的value对象中,以便自动处理它。

您可能希望使用类似于a或UUID的东西。具体如何生成短代码取决于应用程序使用的语言。

您可以将生成短代码的责任分配给调查问卷汇总。它可以基于嵌入问卷对象的简单计数器。每个想要创建短代码的实体都会调用其包含调查问卷的NextShortCode()方法来获取下一个唯一(在当前调查问卷范围内)短代码值。

您的“短代码”是生成的还是系统的输入?这将改变答案。i、 例如,如果我输入了一个新的短代码,而这个短代码在任何地方都不存在,它会被插入吗?不过,一般来说,通过服务层驱动您的输入。该服务可以调用以构建聚合并验证其唯一性。如果它是唯一的,则允许插入/更新。如果不是,就不要让它发生。域在域对象以及调用它们的服务中是分层的。根据您所做工作的范围,您的业务逻辑将位于不同的位置。