【问题标题】:Is it possible to extend services dynamically in a dependency injection?是否可以在依赖注入中动态扩展服务?
【发布时间】:2016-03-29 20:50:49
【问题描述】:

我正在做一个 Symfony2 项目。 Symfony 有一个非常酷的依赖注入系统,但我想知道是否可以动态扩展某些服务...

例如,我有一个由第三方库/捆绑包注册的供应商服务 X。现在,我需要扩展该服务,我们称它为 Y... 我可以通过在服务配置中使用相同的服务 ID 来做到这一点。所以这一切都很好......

但是现在,我需要一个从 Y 扩展的服务 Z,而该服务不知道它实际上是从 Y 而不是 X 扩展的(因为供应商服务是 X),所以我可以像使用 X 一样使用服务 Z在不丢失 Y 功能的情况下降低应用程序逻辑。

我希望我的解释有点道理,基本上我的问题是:这可能吗?如果是这样,我应该如何实现这一目标?

【问题讨论】:

  • 您可以装饰现有服务而不是替换is:symfony.com/doc/current/components/dependency_injection/…
  • 这似乎正在做我需要的......这对我来说是全新的,所以我要研究这个解决方案,谢谢!也许如果您将此添加为答案并且事实证明它是最佳解决方案,我会将其标记为最有帮助的,以便其他遇到此问题的人会看到它。
  • 我添加了一个答案。随时询问您是否需要更多信息。 :)

标签: symfony service dependency-injection dependencies extending


【解决方案1】:

您可以装饰现有服务而不是替换它:http://symfony.com/doc/current/components/dependency_injection/advanced.html#decorating-services(如果多个定义正在装饰现有服务,您还可以控制应用装饰的顺序)。

【讨论】:

  • 坚持这个答案并结合使用容器参数作为类名的占位符。
【解决方案2】:

我不知道你的 Z、Y 和 X 到底有多相关,但实现这一点的方法是使用编译器传递,它将允许你更改确定服务的定义和类,与捆绑包看起来像:

http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html

关于容器如何编译的完整文档是:

http://symfony.com/doc/current/components/dependency_injection/compilation.html

这不是一件容易的事,因为您必须了解您的捆绑包是如何相互通信的!但我希望它足够了。

【讨论】:

  • 我知道编译器传递/捆绑是如何工作的(我意识到我的问题不是 100% 清楚)但是在服务 Z 不知道它实际上是在扩展 Y 而不是X?您可以将其视为“分层”定义结构,其中 ID 为 X 的服务始终使用最深的扩展结构,无论我们将其扩展到多深...
  • 我认为这是可能的,当然您必须确定要替换哪些调用,如果捆绑包得到一些更新,这也可能有点危险。您是否检查过是否有其他方法可以使用捆绑包?喜欢事件
  • 我主要将其用于向现有服务添加新方法。但也许像将服务的类名设置为容器参数这样简单的事情会起作用……感谢您的输入。你得到了我的支持,但是让问题保持开放,以便其他人可以发表他们的意见。最终将标记为最有效的解决方案:)
  • 没问题,这似乎是一个关于您的设置的非常具体的问题,我希望其他人可以更好地帮助您:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 2016-06-22
  • 1970-01-01
  • 2010-12-29
  • 2019-05-15
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多