我正在努力理解使用 Doctrine 2 实现来自不同有界上下文的两个实体之间的关联映射的正确方法。假设有两个“User”和“Post”实体分别属于“User”和“Content”有界上下文。 “内容”上下文中还有一个“用户”概念,它通过多对一关联确定“帖子”的作者。因此,“内容”上下文中的“用户”只是一个包含用户 ID 的值对象。
我的问题是我应该如何使用 Doctrine 2 来实现这种关联?我有两个解决方案,它们都有自己的问题:
解决方案1:
/**
* @ORM\Entity
* @ORM\Table(name="posts")
* @ORM\HasLifecycleCallbacks()
*/
class Post
{
...
/**
* @ORM\ManyToOne(targetEntity="UserBC\User", inversedBy="posts")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
...
}
解决方案2:
/**
* @ORM\Entity
* @ORM\Table(name="posts")
* @ORM\HasLifecycleCallbacks()
*/
class Post
{
...
/**
* @ORM\Column(type="integer")
*/
private $user_id;
...
}
在第一个解决方案中,“用户”上下文中的“用户”实体已在“内容”上下文中使用,这违反了 BC 彼此独立的 DDD 规则。第二种解决方案遵循 DDD 规则,但会影响数据库架构(通过外键约束删除“users”和“posts”表之间的数据库级关系)。
那么,实施此类关联的正确方式是什么呢?
第二个解决方案是正确的。
正如您所观察到的,应该避免不同 BC 之间的关联。引用另一个 BC 中的实体的正确方法是通过 ID。
这导致 BC 在 DB 中之间没有约束。毕竟,你试图让他们独立。如果你觉得这是错误的,那么解决这个问题的唯一方法就是重新考虑你的 BC 设计,即合并两个 BC。然而,这个决定不应该由代码气味驱动,而应该由上下文映射驱动。
注意:仅当其他 BC 是聚合根时才允许通过 ID 引用实体。如果引用的实体不是 AR,那么您就会有另一种设计味道。虽然不是一个严重的问题,但仍然需要考虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)