我可以在具有数据库锁定的不同服务中使用自动装配的 EntityManager 吗?

Can I use autowired EntityManager across different services with DB locking?

在我的 Symfony 5 项目中,我有 2 个服务,我将 EntityManager 自动连接到这两个服务中:

class MyService1 {

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    // ...
}

class MyService2 {

    public function __construct(EntityManagerInterface $entityManager, MyService1 $myService1)
    {
        $this->entityManager = $entityManager;
        $this->myService1 = $myService1;
    }

    // ...
}

我 运行 MyService2 函数之一内的一些数据库事务:

$this->entityManager->getConnection()->beginTransaction();

我从 MyService1 调用了一些辅助函数,它也使用它自己的 $entityManager 属性 并且也应该在同一个数据库事务中执行。

我的问题是:我是否保证这两个服务将自动连接到 $entityManager 的相同(唯一)实例?这很重要,因为我需要它们都在同一个数据库锁定范围内工作。

我确实使用 dump() 函数对其进行了实验性测试,它们似乎确实指向同一个实例。但是我没有在文档中找到这是否是一个确定的行为,或者某些不能保证发生的随机缓存的结果。

谢谢!

是的,您可以预期它是同一个实例。自动装配的实例在整个应用程序中是相同的。只要您使用默认连接,使用 Entity Manager 实例启动的事务在不同服务中都是相同的。

这基本上就是 Dependency Injection 背后的想法。只有一个实例,它正在被下游服务共享。

从历史上看设计模式,这是“单例”范式的扩展,您将拥有一个带有静态实例化器的全局 class。使用依赖注入,实例由 DI 容器管理,但它始终是相同(相同)的对象。

顺便说一下,锁与事务不同。事务仅在您当前连接的范围内有效,而锁会影响所有连接,直到它被释放。