[英]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.