当前位置:  开发笔记 > 编程语言 > 正文

DDD-使用Doctrine 2的有界上下文之间的关联映射

如何解决《DDD-使用Doctrine2的有界上下文之间的关联映射》经验,为你挑选了1个好方法。

我正在努力理解使用Doctrine 2在来自不同有界上下文的两个实体之间实现关联映射的正确方法。假设有两个分别属于“ User”和“ Content”有界上下文的“ User”和“ Post”实体。在“内容”上下文中还有一个“用户”概念,它通过多对一关联来确定“帖子”的作者。因此,“内容”上下文中的“用户”只是一个包含用户ID的值对象。

我的问题是我应该如何使用教义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规则,但会影响数据库架构(通过外键约束删除“用户”和“帖子”表之间的数据库级关系)。

那么,实现这种关联的正确方法是什么?



1> theDmi..:

第二种解决方案是正确的。

正如您正确观察到的,应避免不同BC之间的关联。引用另一个BC中的实体的正确方法是通过ID。

其结果是,在数据库中,BC之间没有约束。毕竟,您尝试使它们独立。如果您认为这是错误的,那么解决此问题的唯一方法是重新考虑您的BC设计,即合并两个BC。但是,这是一个决定,不应由代码气味引起,而应由上下文映射决定。

注意:仅当其他BC是聚合根时,才允许通过ID引用其他BC。如果引用的实体不是AR,则那里还有另一种设计气味。不是认真的,但仍然需要考虑。

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有