koldown/ioc

库,提供一系列类以实现控制反转(IoC)原则

1.0.0 2019-12-26 15:33 UTC

This package is not auto-updated.

Last update: 2024-09-27 14:09:05 UTC


README

库,提供一系列类以实现控制反转(IoC)原则。

使用方法

首先创建一个工厂 \Koldown\InversionControl\Contracts\IDependenceFactory,在其中定义实例化类对象及其相应依赖项的策略。

class Factory implements \Koldown\InversionControl\Contracts\IDependenceFactory {

    public function build(string $class) {
        switch ($class) {
            case (Sumador::class) :
                return (new ClassInstance(Sumador::class))->setDependence("operacion", Suma::class);

            case (Restador::class) :
                return (new ClassInstance(Restador::class))->setDependence("operacion", Resta::class);

            default : return new $class();
        }
    }
}

在此示例中,我们已设定我们的工厂可以实例化任何请求的类,但我们有两个类需要依赖项才能执行其过程

class Sumador implements IOperador {

    private $operacion;

    public function setOperacion(IOperacionAritmetica $operacion): void {
        $this->operacion = $operacion;
    }

    public function ejecutar(int $a, int $b): int {
        return $this->operacion->ejecutar($a, $b);
    }
}

class Restador implements IOperador {

    private $operacion;

    public function setOperacion(IOperacionAritmetica $operacion): void {
        $this->operacion = $operacion;
    }

    public function ejecutar(int $a, int $b): int {
        return $this->operacion->ejecutar($a, $b);
    }
}

为了实现这一点,我们必须依赖类 Koldown\InversionControl\ClassInstance,它允许我们定义类及其相应依赖项的构建方式。

需要设定依赖项的键名和要实例化的类类型,其中键是一个重要的参数,用于执行此功能,因此库基于依赖注入的原则使用类型为 setter 的方法,因此在定义键为 "operacion" 的示例中,构建对象时将查找 "setOperacion" 函数以注入相应的依赖项。

定义好我们的对象工厂后,我们继续具体应用 IoC 流程,为此我们依赖类 \Koldown\InversionControl\ContainerContext,它负责管理所需类对象的构建。

$context  = \Koldown\InversionControl\ContainerContext::getInstance();
$sumador  = $context->create(Factory::class, Sumador::class);
$restador = $context->create(Factory::class, Restador::class);

echo "Función suma  (9 + 11) = {$sumador->ejecutar(9, 11)}";
echo "Función resta (15 - 6) = {$restador->ejecutar(15, 6)}";

我们已生成两个算术函数的实例,但现在需要将它们封装在一个名为 Calculadora 的单个类中。

class Calculadora {

    private $sumador;

    private $restador; 

    public function setSumador(IOperador $sumador): void {
        $this->sumador = $sumador;
    }

    public function setRestador(IOperador $restador): void {
        $this->restador = $restador;
    }

    public function sumar(int $a, int $b): int {
        return $this->sumador->ejecutar($a, $b);
    }

    public function restar(int $a, int $b): int {
        return $this->restador->ejecutar($a, $b);
    }
}

现在我们来到我们的工厂,并添加这个新案例

case (Calculadora::class) :
    return (new ClassInstance(Calculadora::class))
        ->setDependence("restador", Restador::class)
        ->setDependence("sumador", Sumador::class);

如我们所见,我们可以将之前定义的参数化类作为这个新类的依赖项,这个新类在其构建阶段也会注入其依赖项的依赖项。

这样我们就可以以以下方式执行我们的程序

$context     = \Koldown\InversionControl\ContainerContext::getInstance();

$calculadora = $context->create(Factory::class, Calculadora::class);

echo "Cálculo suma (4 + 8)  = {$calculadora->sumar(4, 8)}";
echo "Cálculo resta (9 - 2) = {$calculadora->restar(9, 2)}";

如果您想查看此练习的详细代码,请进入存储库中的 example 文件夹,您将找到示例文件。

注意

Koldown\InversionControl\ClassInstancesetDependence 函数接收一个第三参数 $shared,类型为 bool,这允许在从 \Koldown\InversionControl\ContainerContext 创建对象时,在请求该依赖项的类之间共享构建的依赖项实例。