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'
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)
{
...
}
}
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报