当前位置: 首页 > 知识库问答 >
问题:

Symfony 4:使用服务工厂实例化多个对象

潘弘壮
2023-03-14

我有一个代表常规路径的类路径,可以用它做一些神奇的事情。每当我想在我的应用程序中处理路径时,我都想快速实例化一个路径对象并继续使用它。Path类有一些依赖项,我想使用自动关联/依赖项注入。

我所尝试的:

我将该类作为一个服务,并创建了一个工厂方法,类似于这里所描述的:https://symfony.com/doc/current/service_container/factories.html. 工厂方法接收依赖项作为参数,并将它们存储在私有属性中。只要在需要实例的地方使用依赖项注入,我就能够获得新实例。这里的依赖项没有问题。现在的问题是,使用依赖注入只能获得一个实例。是的,我可以在over上克隆一个“普通”对象,但我想有更好的解决方案。手动调用工厂方法不起作用,因为其中存在依赖项注入。

服务和控制器:

<?
// Service
namespace App\Service;

class Path {
    private $dep;

    public function __construct(DependencyName $dep) {
        $this->dep = $dep;
    }

    public static function factory(DependencyName $dep) {
        $path = new Path($dep);
        return $path;
    }

    // some methods
}

// Controller
namespace App\Controller;

use App\Service\Path;

class SomeController {
    public function generatePaths() {
        for (int i = 0; i < 10; i++) {
            $paths[] = Path::factory(/* missing dependencies */);
        }
    }

    public function __construct(Path $path) {
        // here I can have one Path without a problem
        // but I need more than one
    }
}

在服务业。亚马尔:

App\Service\Path:
        # call the static method
        factory: ['App\Service\Path', 'factory']

更一般的是:当我使用自动连接时,如何创建具有依赖关系的服务的多个实例?解决方案不应仅限于控制器。我需要在其他服务中使用此服务。

共有1个答案

南宫泓
2023-03-14

您可以在服务定义中使用shared选项:

在服务容器中,默认情况下共享所有服务。这意味着[……]您将得到相同的实例。在某些情况下,您可能希望始终获得一个新实例。

通过这样做(因为我知道你的依赖总是相同的),你不再需要工厂方法,并且可以将定义更改为:

App\Service\Path:
        class: App\Service\Path
        shared: false

要拥有多个实例,您不能使用注入,因此您需要实现ServiceSubcriberInterface并注册您的服务,以便您可以在每次需要时手动从容器中检索它,同时仍然利用自动连接。

我不会详细介绍,因为有几个选项,其中一个可能比其他选项更有意义,但一旦实施,就要做:

$path = $this->get('path_builder'); // Whatever your alias is

每次都会给您一个新实例。

 类似资料:
  • 自 1.5 后就过时了 在 Hangfire 1.5 之后,您不需要额外的配置来支持多个服务实例处理同一个后台任务,可以跳过本文了。现在使用 GUID 生成服务器标识符,因此所有实例名称都是唯一的。 可以同时在一个程序、机器或多台机器上运行多个服务器实例。每个服务实例使用分布式锁来执行协调逻辑。 在上述情况中,每个Hangfire服务器都有一个唯一的由两部分组成的供默认值标识符。最后一部分是一个程

  • 我试图用工厂创建一些单例对象: 我想使用 getInstance(布尔新实例)方法来生成一个新对象或重用现有的单例对象。 如果newInstance为true:我将生成一个新的单例对象 如果newInstance为false:如果myObject为null,则生成一个新的并返回,或者如果myObjects不为null则返回它。 而且这个getInstance(boolean newInstance

  • 当更改中的时,发现中的也会更改,例如是单例? 我的假设是,一个新的实例被注入到带有工厂的控制器中?

  • 问题内容: 据我了解,当在工厂内部时,我返回一个注入到控制器中的对象。在服务内部时,我使用而不是返回任何东西来处理对象。 我当时以为服务 始终是单例 ,并且每个控制器都注入了一个 新的工厂对象 。但是,事实证明,工厂对象也是单例对象吗? 示例代码演示: 当改变的事实证明,在也发生了变化,比如是一个单身? 我的假设是在工厂的控制器中注入了新实例? 问题答案: 所有角度服务都是单例 : Docs(请参

  • 问题内容: 我试图了解Angular中工厂和服务的概念。我在控制器下有以下代码 此代码可以正常工作。但是,当我将$ http服务移入工厂时,我无法将数据返回到控制器。 使用工厂有什么好处,因为$ http即使在控制器下也可以工作 问题答案: 将服务移出控制器的目的是实现关注点分离。服务的工作是知道如何与服务器通信,而控制器的工作是在视图数据和服务器数据之间转换。 但是,您会混淆异步处理程序以及返回

  • 问题内容: 编辑2016年1月: 由于这仍然引起注意。自问了这个之后,我已经完成了一些AngularJS项目,对于我最常使用的那些项目,建立了一个对象并最后返回了该对象。但是,我下面的说法仍然正确。 编辑: 我想我终于了解了两者之间的主要区别,并且我有一个代码示例来演示。我也认为这个问题与建议的重复问题有所不同。重复项说明该服务不可实例化,但是如果您按照我在下面的演示中进行设置,它实际上是可实例化