为了账号安全,请及时绑定邮箱和手机立即绑定

symfony 中非共享服务的目的是什么?

symfony 中非共享服务的目的是什么?

PHP
交互式爱情 2021-11-13 10:34:19
我明白,如果我使用非共享服务,我每次请求该服务时都会获得新实例。这将允许我在此类服务中安全地使用类属性,如果我在共享服务上这样做是不明智的 - 它与并发问题有点相似。但是,与普通的旧 php 对象相比,非共享服务的优势是什么?我只能考虑在服务对象内部获得 DI 容器访问权限,但这不是大问题,因为我可以将我需要的内容传递给 POPO 的构造函数或 setter。我错过了什么吗?
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

就我个人而言,这归结为方便。是的,您可以使用简单的对象获得几乎相同的功能。但尤其是在需要大量依赖项的情况下,将所有依赖项传递给您需要的每个实例可能会有点麻烦。


只需一次定义服务及其所需的所有依赖项,然后根据需要简单地传递它,就更容易了。在需要非共享服务的地方,您只传递这个单一服务,而不是创建对象实例所需的 10 个其他依赖项。


我想在 YML 中使用非自动装配的例子是:


services:

    App\NonSharedService:

        autowire: false

        shared: false

        arguments:

            - '@dependency1'

            - '@dependency2'

            ...

            - '@dependency15'


    App\RandomService1:

        autowire: false

        arguments:

            - '@App\NonSharedService'


    App\RandomService2:

        autowire: false

        arguments:

            - '@App\NonSharedService'

现在,在内部创建 PHP 对象的情况下,您需要将所有依赖项传递给两者App\RandomService#:


services:

    App\RandomService1:

        autowire: false

        arguments:

            - '@dependency1'

            - '@dependency2'

            ...

            - '@dependency15'


    App\RandomService2:

        autowire: false

        arguments:

            - '@dependency1'

            - '@dependency2'

            ...

            - '@dependency15'


查看完整回答
反对 回复 2021-11-13
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我最近使用非共享服务作为工作服务类的 DI 助手。


我有一个主管道来处理所有带有JobInterface.


每个 Job 类可能有也可能没有自己的依赖项和自己的参数。因此,以旧方式这样做会很麻烦:


$job = new JobA(arg1, arg2); // Argh no DI...

// Do stuff to inject services !!

$pipe->dispatch($job);

所以我做了类似的事情:


services:

...

    App\Job\:

        resource: '../Job/'

        public: true # needed to use $container->get()

        shared: false

$job = $container->get(JobA::class); // Hello DI !

$job->init(arg1, arg2);

$pipe->dispatch($job);

我可以在需要时使用 DI 注释的强大功能:


class JobA implements JobInterface

{

    /**

     * @Required

     */

    public function setMyService(MyService $myService)

    {

       ...

    }

}


查看完整回答
反对 回复 2021-11-13
  • 2 回答
  • 0 关注
  • 122 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信