【问题标题】:Does Symfony2 Dependency Injection support Object Lifestyle?Symfony2 依赖注入是否支持对象生活方式?
【发布时间】:2014-05-29 17:49:59
【问题描述】:

我有一个通过 Symfony 2 中的依赖注入加载的类。 它有许多默认的私有变量,我可以用 setter 覆盖它们。

问题是,一旦将这些默认值之一设置为页面中的其他值,就无法自动将其设置回来。 我不想再次使用 new 调用该类,因为它消除了依赖注入的用处。

那么,Symfony2 是否支持 Object LifeStyle,或者我基本上需要编写一个公共函数来将所有默认设置恢复正​​常并在每次需要时调用它。

例如,我使用一个类来获取远程文件。它具有 UserAgent、接受的语言/编码、方法等的默认值。但是,如果我将方法设置为 POST,而不是页面中一次调用的默认 GET,那么下次我调用它时,它仍然是 POST,因为我希望它再次成为默认的 GET,如果我使用 new 而不是通过依赖注入。

【问题讨论】:

  • 一些可能的解决方案:不要使用共享服务(每次都创建一个新实例);使用范围

标签: symfony dependency-injection


【解决方案1】:

将范围:原型添加到您的服务定义中。这将确保您每次请求类时都从容器中获取一个新实例。当然,实例将具有默认值。

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

【讨论】:

  • 正是我需要的!谢谢。我要补充一点,我在 $container->register('x')->setScope() 下使用它,而不是在 $container->setDefinition('x')->setScope() 下使用它。但仍然是我需要的!
  • 如何将我的类的范围设置为原型,而不必让所有的父类、控制器等成为原型?我感兴趣的类是原型是有意义的,但不是它被注入的东西。目前,它出现了 ScopeCrossingInjectionException。
  • 例如就目前而言,如果我的获取远程文件类是原型,则任何使用我的获取远程文件类的类或控制器都必须设置为原型。
猜你喜欢
  • 2023-01-04
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多