我们应该在子服务和父服务中同时注入服务参数,还是创建一个方法从父服务返回它?


Should we inject a service parameter in both a child and parent service or create a method to return it from parent service

我有几个服务,其中一个有一些我需要的变量,被注入到两个服务中,这两个被注入到另一个服务中,我需要使用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_forum_functions被注入到vb_members_modulevb_posts_module中。然后,我将这两个注入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注入到它们中,其中已经有了变量。

可选

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)到服务(vb_logger),其中注入了另外两个服务(两个模块),每个有vb_forum_functions注入?

  2. 如何使其只有在vb_logger中使用的模块是实例化,以避免另一个也创建一个无意义的vb_forum_functions object self.

通过存储与一个服务不相关的信息并将其发布给另一个服务使用,您减少了这些服务的封装并增加了它们的紧密耦合程度。

例如,在将来,如果你修改了父服务,不再需要注入的东西,那么你将无法删除它,而不同时修改从外部访问它的所有内容。

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

在这种情况下,只要在你需要的地方注入东西,并保持你的接口干净。