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

我明白,如果我使用非共享服务,我每次请求该服务时都会获得新实例。这将允许我在此类服务中安全地使用类属性,如果我在共享服务上这样做是不明智的 - 它与并发问题有点相似。

但是,与普通的旧 php 对象相比,非共享服务的优势是什么?

我只能考虑在服务对象内部获得 DI 容器访问权限,但这不是大问题,因为我可以将我需要的内容传递给 POPO 的构造函数或 setter。

我错过了什么吗?


交互式爱情
浏览 124回答 2
2回答

心有法竹

就我个人而言,这归结为方便。是的,您可以使用简单的对象获得几乎相同的功能。但尤其是在需要大量依赖项的情况下,将所有依赖项传递给您需要的每个实例可能会有点麻烦。只需一次定义服务及其所需的所有依赖项,然后根据需要简单地传递它,就更容易了。在需要非共享服务的地方,您只传递这个单一服务,而不是创建对象实例所需的 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'

一只斗牛犬

我最近使用非共享服务作为工作服务类的 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)    {       ...    }}
打开App,查看更多内容
随时随地看视频慕课网APP