簡體   English   中英

將依賴注入容器傳遞給靜態方法

[英]Pass Dependency Injection Container to static method

我有一些傳統課程。 許多類是使用工廠類實例化的。

還有一個單例類。

將來我想用 DIC 完全取代它們。 目前代碼庫很大,無法做到這一點。

現在我的目標是將 DI-Container 注入到 Singleton 類實例化的每個服務中。 Singleton 類有一個帶有此簽名的靜態方法。

final class Singleton
{
  private static $singletonCache = array();

  public static function getInstance($namespace, $className)
  {
  }
}

在此函數內部,我想檢查:

$instance = new $className();

if($instance instanceof ContainerAwareInterface)
{
  // TODO: how do we get the container here
  $instance->setContainer($container);
}

但是我怎樣才能最好地獲得我的“單例類”中的容器,它只被靜態調用?

另一種方法是在需要時全局訪問容器:

public static function getInstance($namespace, $className)
{
  $container = $_GLOBAL['kernel']->getContainer();
}

當然,這種方法有一些問題,但只要你正在過渡,就足夠了。

在引導代碼的早期某處,但在實例化容器之后,您可以將容器傳遞給單例類:

Singleton::setContainer($container);

它將容器存儲在靜態屬性中:

final class Singleton
{
    // ...

    private static $container;

    public static function setContainer(ContainerInterface $container)
    {
        self::$container = $container;
    }
}

但是,正如您在單例類的示例中了解到的那樣,所有全局狀態都讓您頭疼。 傳遞容器(並使用 ContainerAware)是要避免的事情。 通過將容器傳遞給您的服務,您讓它們依賴於整個服務世界。 只傳遞您實際需要的協作者會更干凈。 它也更容易測試。

此答案中提供了另一種解決方案,它與該問題的其他答案幾乎相同,只是使用global關鍵字而不是$_GLOBAL數組來訪問內核對象。

public static function getInstance($namespace, $className)
{
  global $kernel;
  $container = $kernel->getContainer();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM