Kid*_*ond 5 entity domain-driven-design domain-model value-objects
我有一个值对象LoginAuth,其中包含User我的辅助登录系统的身份验证数据。
对于每个登录User,都可以选择是否选择辅助登录。因此User实体并不保存LoginAuth值对象,而是LoginAuth值对象包含User它所属的实体。
由于我的数据库已标准化,因此我将此值对象存储在一个单独的表中,其中 是user_id主键(以确保唯一性)。
正如您所看到的,我的值对象并不存在于实体内部,而是独立存在,但它确实包含它所属的实体。我的问题是:
价值对象可以在不存在于实体内部的情况下存在吗?
也许这需要是一个实体?
每个都LoginAuth应该是唯一的(每个 只User允许有一个唯一LoginAuth),因此不会有任何与此 VO 相同的内容。
注意:我的域不包含此登录系统的应用逻辑。只是它应该处理的数据。它的应用逻辑驻留在我的模型层的应用层中。
价值对象可以在不存在于实体内部的情况下存在吗?
是的他们可以。一些临时值对象只能用于计算,并且永远不会持久化或与实体相关。
然而,这不是我们在这里讨论的对象类型。LoginAuth显然与它有关系User并与之一起持续存在。
为了确定这种关系的方向(你所说的“住在里面还是住在外面”),你必须考虑获取参考资料。在 DDD 中,只有聚合根可以从存储中重新水化(通过存储库)。一旦获得了根的引用,您就可以导航到其聚合中的实体和值对象。
如果您在这一点上遵循 DDD,则不允许您直接从数据库获取值对象。您必须加载整个聚合,然后通过实体获取对 VO 的引用。因此,您需要在实体中存储对值对象的引用,或者至少在实体中内置一些可以生成 VO 的内容。在您的示例中,这会导致User保留LoginAuth. 仅靠相反的做法是行不通的。
注意:我的域不包含此登录系统的应用逻辑。只是它应该处理的数据。它的应用逻辑驻留在我的模型层的应用层中。
如果您采用 CQRS 方法来实现此目的,并且“登录系统”仅意味着读取LoginAuth,您可以绕过存储库并使用读取模型直接获取您想要的数据。
然而,这仅涵盖事物的读取方面。我想您仍然希望能够在某个时候更改用户的 LoginAuth,因此仍然需要对其进行写入端聚合突变。