DI 容器的服务定位器
Service Locator for DI Container
我创建了一个非常简单的依赖注入容器。我可以通过以下语句创建 class 的实例:
$foo = $container->get(Foo::class);
这很好用,允许我在 Foo 的构造函数中注入依赖项。现在我想创建一个 class 的实例,方法是:
$user = new User();
我需要能够从用户 class 中的容器访问服务,但我不确定最好的方法。我想避免的两种方法是一种将容器传递给构造函数,第二种使用容器的 get 方法(如上所示)创建 Foo 的实例。
如果有人能告诉我实现此目标的正确方法,我将不胜感激。谢谢
您不必注入构造函数。有几种注入方式是通过 setter 函数
public function setUser(User $user) {
$this->user = $user;
}
或者直接注入需要与class
交互的函数
public function someFunction(User $user) {
$val = $user->doSomething();
}
我想出了一个巧妙的方法来做到这一点。首先,我向指向当前实例的容器添加了一个静态 属性 。例如:
class Container {
protected static $instance;
public function __construct() {
static::$instance = $this;
}
...
}
然后我所要做的就是创建一个静态获取方法,例如:
public static function getInstance($name) {
return static::$instance->get($name);
}
很遗憾,它不能具有相同的名称。单击 here 以获取实现它的 hacky 方法。
现在我可以在我的用户 class 中说以下内容:
var foo = Container::getInstance(Foo::class);
我创建了一个非常简单的依赖注入容器。我可以通过以下语句创建 class 的实例:
$foo = $container->get(Foo::class);
这很好用,允许我在 Foo 的构造函数中注入依赖项。现在我想创建一个 class 的实例,方法是:
$user = new User();
我需要能够从用户 class 中的容器访问服务,但我不确定最好的方法。我想避免的两种方法是一种将容器传递给构造函数,第二种使用容器的 get 方法(如上所示)创建 Foo 的实例。
如果有人能告诉我实现此目标的正确方法,我将不胜感激。谢谢
您不必注入构造函数。有几种注入方式是通过 setter 函数
public function setUser(User $user) {
$this->user = $user;
}
或者直接注入需要与class
交互的函数public function someFunction(User $user) {
$val = $user->doSomething();
}
我想出了一个巧妙的方法来做到这一点。首先,我向指向当前实例的容器添加了一个静态 属性 。例如:
class Container {
protected static $instance;
public function __construct() {
static::$instance = $this;
}
...
}
然后我所要做的就是创建一个静态获取方法,例如:
public static function getInstance($name) {
return static::$instance->get($name);
}
很遗憾,它不能具有相同的名称。单击 here 以获取实现它的 hacky 方法。
现在我可以在我的用户 class 中说以下内容:
var foo = Container::getInstance(Foo::class);