是否可以在依赖注入中动态扩展服务?
Is it possible to extend services dynamically in a dependency injection?
我正在做一个 Symfony2 项目。 Symfony 有一个非常酷的依赖注入系统,但我想知道是否可以动态扩展一些服务...
例如,我有一个由第三方注册的供应商服务 X library/bundle。现在,我需要扩展该服务,我们称其为 Y...
我可以通过在服务配置中使用相同的服务 ID 来做到这一点。所以这一切都很好...
但是现在,我需要一个从 Y 扩展的服务 Z,服务不知道它实际上是从 Y 而不是 X 扩展(因为供应商服务是 X),所以我可以像使用 X 一样使用服务 Z在所有下降的应用程序逻辑中,而不会丢失 Y 的功能。
我希望我的解释有点道理,基本上我的问题是:这可能吗?如果是这样,我应该如何实现这一目标?
我不知道你的 Z、Y 和 X 到底有多紧密,但实现它的方法是使用编译器传递,它将允许你更改定义和确定的 class服务,与捆绑包的简单集成如下所示:
http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html
容器编译的完整文档是:
http://symfony.com/doc/current/components/dependency_injection/compilation.html
这不会是微不足道的,因为您必须了解您的包是如何相互通信的!但我希望它足够了。
您可以修饰现有服务而不是替换它:http://symfony.com/doc/current/components/dependency_injection/advanced.html#decorating-services(如果有多个定义修饰现有服务,您还可以控制应用修饰的顺序)。
我正在做一个 Symfony2 项目。 Symfony 有一个非常酷的依赖注入系统,但我想知道是否可以动态扩展一些服务...
例如,我有一个由第三方注册的供应商服务 X library/bundle。现在,我需要扩展该服务,我们称其为 Y... 我可以通过在服务配置中使用相同的服务 ID 来做到这一点。所以这一切都很好...
但是现在,我需要一个从 Y 扩展的服务 Z,服务不知道它实际上是从 Y 而不是 X 扩展(因为供应商服务是 X),所以我可以像使用 X 一样使用服务 Z在所有下降的应用程序逻辑中,而不会丢失 Y 的功能。
我希望我的解释有点道理,基本上我的问题是:这可能吗?如果是这样,我应该如何实现这一目标?
我不知道你的 Z、Y 和 X 到底有多紧密,但实现它的方法是使用编译器传递,它将允许你更改定义和确定的 class服务,与捆绑包的简单集成如下所示:
http://symfony.com/doc/current/cookbook/service_container/compiler_passes.html
容器编译的完整文档是:
http://symfony.com/doc/current/components/dependency_injection/compilation.html
这不会是微不足道的,因为您必须了解您的包是如何相互通信的!但我希望它足够了。
您可以修饰现有服务而不是替换它:http://symfony.com/doc/current/components/dependency_injection/advanced.html#decorating-services(如果有多个定义修饰现有服务,您还可以控制应用修饰的顺序)。