шаблоны проектирования — что добавить в мой контейнер ioc? Переполнение стека

я создал свой собственный контейнер, я сделал метод «связать», который получает «string $ alias» и «Closure $ closure». метод привязывает псевдоним к объекту в массиве $ container, например:

public function bind(string $alias,$closure)
{
$this->container[$alias] = $closure();
}

Второй метод — это «вызов», который просто вызывает некоторый экземпляр из $ контейнера. Конечно, сначала метод проверяет, существует ли данный псевдоним, и если не выдает исключение

public function call(string $alias)
{
if(array_key_exists($alias,$this->container))
return $this->container[$alias];
throw new \Exception();
}

это хорошо ? что еще мне нужно добавить? потому что я видел на Laravel, например, что контейнер полон методов и реквизита, и я не знаю почему. его просто связать и позвонить, не так ли?

0

Решение

Я предлагаю сделать следующее:

привязывать

public function bind(string $alias,$closure)
{
$this->container[$alias] = $closure;
}

Call (новый экземпляр за вызов)

public function call(string $alias)
{
if(array_key_exists($alias,$this->container)) {
$closure = $this->container[$alias];
return $closure();
}
throw new \Exception();
}

Call (одиночное поведение)

public function call(string $alias)
{
if (array_key_exists($alias,$this->instanceContainer)) {
return $this->instanceContainer[$alias];
}
if(array_key_exists($alias,$this->container)) {
$closure = $this->container[$alias];
$this->instanceContainer[$alias] = $closure();
return $this->instanceContainer[$alias];
}
throw new \Exception();
}

Какую из двух реализаций вы выберете для вызова, будет зависеть от ваших потребностей. Если вам нужно вызывать функцию только один раз для каждого объекта, перейдите ко второму. Вы также можете иметь 2 метода: bind а также bindSingleton дифференцировать два разных типа привязки.

Есть две основные причины, по которым я рекомендую это:

  1. Объект создается по требованию, что означает, что если вы связываете 1000 объектов, но используете только 10, вы создаете только 10 объектов.

  2. Результат $closure() метод может отличаться в зависимости от времени его вызова. Например, если вы хотите создать экземпляр объекта, который содержит метку времени, более целесообразным является его создание по вызову, а не по привязке.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector