【问题标题】:Symfony2 Lazy Services When to use?Symfony2 Lazy Services 什么时候使用?
【发布时间】:2015-03-05 01:39:16
【问题描述】:

我有一个关于 symfony2 惰性服务的问题。我们什么时候应该使用惰性服务,什么时候应该避免它们?如果我们使用惰性服务,是否会产生任何开销?

【问题讨论】:

    标签: php symfony dependency-injection lazy-loading proxies


    【解决方案1】:

    来自documentation

    在某些情况下,您可能希望注入一个实例化有点繁重的服务,但并不总是在您的对象中使用。例如,假设您有一个 NewsletterManager,并且您向其中注入了一个邮件服务。您的 NewsletterManager 上只有少数方法实际使用了邮件程序,但即使您不需要它,邮件服务也会被实例化以构建您的 NewsletterManager。

    配置惰性服务是解决此问题的方法之一。使用惰性服务时,实际上会注入邮件服务的“代理”。它的外观和行为与邮件程序类似,只是邮件程序在您以某种方式与代理交互之前不会被实际实例化。

    是的,有一些开销。但它是最小的。当你不需要它们时,你应该避免使用惰性服务。 (就这么简单)。

    示例:

    如果您的服务 A 有 3 种方法并且依赖于 B 和 C。如果您知道 B 用于所有 3 种方法中并且 C i 仅用于一种方法中,那么您可以考虑将 C 声明为懒惰的。如果 C 是一个繁重的服务,你应该声明它是惰性的。在此示例中,将 B 声明为惰性不会有任何好处...所以不要... =)

    【讨论】:

    • 如果我让我的所有服务都变得懒惰是否正确?如果我使用惰性服务而不是普通服务有什么缺点?
    • 据我所知,除了开销之外没有其他问题。 Doctrine 默认延迟加载其所有实体。模型和服务之间的区别在于,服务不应该依赖(与之相关)它不使用的东西。所以,如果你觉得你有很多没有使用的依赖项,那么你的服务太大了。只有在极少数情况下您才需要此功能。重构应该是你的首选。
    • 我的问题很笼统,我只是想知道,如果我的应用程序中有 10-15 个服务,则很少有可能依赖于其他服务,而很少有没有。 symfony2 如何对待它们。它们是从头开始实例化,还是在我调用它们时被实例化(通过调用 $this->get('service_name'))。让他们变得懒惰有助于加快系统速度吗?
    • 好吧,我明白你的问题了。当您调用 $this->get('service_name')) 时,服务 'service_name' 及其所有依赖项将被实例化。声明为惰性的依赖项将在第一次使用时被实例化(当您实际上想要从该惰性服务中获得某些东西时)。例如 $this->get('service_name'))->getMailerService->send() 你所有其他不使用的服务都不会被实例化。
    • 使用惰性服务实际上是有开销的。基本上,创建了一个代理对象。所以不要让你所有的服务都变得懒惰。正如@Tobias 所说,只有在实例化繁重并且您不知道是否真的需要它时才声明服务惰性。将邮件程序注入到侦听器中,根据具体请求,该侦听器实际上可能需要也可能不需要发送邮件,这是典型的用例。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2022-11-10
    相关资源
    最近更新 更多