值对象可以在没有实体的情况下存在吗?

Kid*_*ond 5 entity domain-driven-design domain-model value-objects

我有一个值对象LoginAuth,其中包含User我的辅助登录系统的身份验证数据。

对于每个登录User,都可以选择是否选择辅助登录。因此User实体并不保存LoginAuth值对象,而是LoginAuth值对象包含User它所属的实体。

由于我的数据库已标准化,因此我将此值对象存储在一个单独的表中,其中 是user_id主键(以确保唯一性)。

正如您所看到的,我的值对象并不存在于实体内部,而是独立存在,但它确实包含它所属的实体。我的问题是:

  • 价值对象可以在不存在于实体内部的情况下存在吗?

  • 也许这需要是一个实体?

    每个都LoginAuth应该是唯一的(每个 只User允许有一个唯一LoginAuth),因此不会有任何与此 VO 相同的内容。

注意:我的域不包含此登录系统的应用逻辑。只是它应该处理的数据。它的应用逻辑驻留在我的模型层的应用层中。

gui*_*e31 5

价值对象可以在不存在于实体内部的情况下存在吗?

是的他们可以。一些临时值对象只能用于计算,并且永远不会持久化或与实体相关。

然而,这不是我们在这里讨论的对象类型。LoginAuth显然与它有关系User并与之一起持续存在。

为了确定这种关系的方向(你所说的“住在里面还是住在外面”),你必须考虑获取参考资料。在 DDD 中,只有聚合根可以从存储中重新水化(通过存储库)。一旦获得了根的引用,您就可以导航到其聚合中的实体和值对象。

如果您在这一点上遵循 DDD,则不允许您直接从数据库获取值对象。您必须加载整个聚合,然后通过实体获取对 VO 的引用。因此,您需要在实体中存储对值对象的引用,或者至少在实体中内置一些可以生成 VO 的内容。在您的示例中,这会导致User保留LoginAuth. 仅靠相反的做法是行不通的。

注意:我的域不包含此登录系统的应用逻辑。只是它应该处理的数据。它的应用逻辑驻留在我的模型层的应用层中。

如果您采用 CQRS 方法来实现此目的,并且“登录系统”仅意味着读取LoginAuth,您可以绕过存储库并使用读取模型直接获取您想要的数据。

然而,这仅涵盖事物的读取方面。我想您仍然希望能够在某个时候更改用户的 LoginAuth,因此仍然需要对其进行写入端聚合突变。