我们是否应该在子服务和父服务中注入服务参数,或者创建一个从父服务返回它的方法

时间:2015-10-02 06:56:57

标签: php symfony oop dependency-injection

我有一些服务,一个,它有一些我需要的变量,注入两个服务,这两个注入到另一个服务,我需要使用config.yml中的一个参数传递给底部的构造函数,进入最后一个服务。

vb_logger:
    class: BlotBundle\VBLogger\VBLogger
    arguments: ["@vb_members_module","@vb_posts_module"]
vb_forum_functions:
    class: BlotBundle\VBLogger\VBForumFunctions
    arguments: [%website%, %username%, %password%]
vb_members_module:
    class: BlotBundle\VBLogger\modules\Module_members
    arguments: [@vb_forum_functions]
vb_posts_module:
    class: BlotBundle\VBLogger\modules\Module_posts
    arguments: [@vb_forum_functions]

这是我的服务。如您所见,我在 vb_forum_functions 中注入%website%,%username%,%password%,我需要在 vb_logger 。在 vb_members_module vb_posts_module 中都会注入 vb_forum_functions 。然后,我将这两个注入 vb_logger

要在 vb_logger 中访问我的变量,我需要在 vb_forum_functions 中创建返回它们的方法,然后执行类似

的操作
public function __construct(Module_members $module_members, Module_posts $module_posts)
{
    $this->vbff = $module_members->getVbff();

    $this->module_members = $module_members;
    $this->module_posts = $module_posts;
}

Module_members 中创建一个方法,用于检索我的变量注入的 vb_forum_functions

protected $vbff;

public function __construct(VBForumFunctions $vbff) {
    $this->vbff = $vbff;
}

public function getVbff()
{
    return  $this->vbff;
}

最后,在 vb_logger 中我可以得到我的变量:

 $this->password= $module_members->getVbff()->getPassword();

这听起来像是很多工作和奖励方法,但比将参数再次直接注入服务更有意义,特别是因为它们已经通过两个模块类注入,具有 vb_forum_functions < / strong>注入它们,已经有变量。

替代方案是

vb_logger:
    class: BlotBundle\VBLogger\VBLogger
    arguments: ["@vb_members_module","@vb_posts_module",%website%, %username%, %password%]
vb_forum_functions:
    class: BlotBundle\VBLogger\VBForumFunctions
    arguments: [%website%, %username%, %password%]

但同样,变量已经在两个级别以下可用,是否值得再次注入?

另外,如果 vb_logger 不使用我的模块,那么我是不是以不正当的方式注入了它们?因为他们自己也创建了一个 vb_forum_functions 对象,因为它没有被使用也是无用的,在我只使用一个模块的情况下。即便如此,我可以通过其中一个模块访问此对象,因此另一个模块不必将其注入 vb_logger

简而言之:

  1. 如何将服务的变量(vb_forum_functions)访问到 service(vb_logger)中注入了两个其他服务(两个 模块)每个都有vb_forum_functions注入?

  2. 如何制作,只有 vb_logger 中使用的模块才是     实例化,以避免另一个也创造无意义的      vb_forum_functions 反对自己。

1 个答案:

答案 0 :(得分:1)

通过存储与一个服务无关的信息并将其发布以供另一个服务使用,您正在减少对这些服务的封装并增加它们的紧密耦合。

例如将来,如果您将父服务更改为不再需要注入的内容,那么您将无法删除它而不会更改从外部访问它的所有内容。

如果某些事情与服务的核心责任无关,那么一般来说添加它是一个坏主意(单一责任原则),除非不这样做的开销很大。

在这种情况下,只需在需要的地方注入物品并保持接口清洁。