DDD和MongoDB:让Mongo创建ObjectID可以吗?

DDD和MongoDB:让Mongo创建ObjectID可以吗?,mongodb,domain-driven-design,factory-pattern,hilo,object-identity,Mongodb,Domain Driven Design,Factory Pattern,Hilo,Object Identity,根据DDD(蓝皮书,Evans)的说法,工厂有责任在有效状态下创建聚合根。这是否意味着它应该能够创建技术id(mongoDB world中的objectId)以及域id 一方面,这似乎是一个技术细节,让Mongo处理ID的创建似乎没问题 另一方面,启用按id查询(通过在DDD存储库中拥有getById)会将技术id公开给域,这反过来会使工厂负责创建它 也许我不能理解技术Id和域Id的不同用例/重叠等,或者我太热心了,但我还是很感激你的意见 简言之: 在DDD中:工厂应该能够创建技术Id和域Id吗

根据DDD(蓝皮书,Evans)的说法,工厂有责任在有效状态下创建聚合根。这是否意味着它应该能够创建技术id(mongoDB world中的objectId)以及域id

一方面,这似乎是一个技术细节,让Mongo处理ID的创建似乎没问题

另一方面,启用按id查询(通过在DDD存储库中拥有
getById
)会将技术id公开给域,这反过来会使工厂负责创建它

也许我不能理解技术Id和域Id的不同用例/重叠等,或者我太热心了,但我还是很感激你的意见

简言之: 在DDD中:工厂应该能够创建技术Id和域Id吗

可能的实现:Hi/Lo()

编辑:尽管hi/lo方式将工厂公开给持久化层,这只有存储库应该知道。嗯


谢谢,工厂不必关心ID,因为聚合的有效性与标识是正交的。标识可以通过几种不同的方式分配,或者作为关系数据库中的增量标识(在这种情况下,存储库必须对其进行管理),或者作为UUID/GUID(在这种情况下,它可以由工厂、存储库或甚至调用客户机进行分配),这很方便,因为客户机默认拥有密钥


只要有可能,我都会尝试维护聚合的单一标识。我不确定MongoDB是否需要额外的技术ID,但如果需要,并且域ID不能代替它使用,那么MongoDB应该自己在幕后管理它。

“聚合的有效性与标识正交。”。当然,在某些情况下,聚合必须有一个标识才能被称为有效的?但实际上只有一个域标识(应该在工厂中正确设置),而不是技术id。我仍然无法理解为什么在mongodb中有一个单独的技术id是首选的(尽管不是必需的),但我想这是一个完全不同的问题,一个指定的标识值可以表示聚合是持久的,但有效性是不同的。我当然看到了这段关系,我只是认为身份在这方面得到了特殊的对待……次要的不完全相关的评论;MongoDB实际上并不创建ID,客户端(驱动程序)创建ID(upsert操作除外)。