工厂是否使用IoC容器服务定位器?

时间:2017-08-22 07:14:18

标签: dependency-injection factory factory-pattern

假设我有一个工厂通过方法返回不同的类。

class CarFactory
{
    public function __construct(ContainerInterface $container) 
    {
        $this->container = $container;
    }

    public function createCarOne() : CarInterface
    {
        return $this->container->make(CarOneClass::class);
    }

    // Vs 

    public function createCarTwo() : CarInterface
    {
        return new CarTwoClass({Inject Dependencies Here});
    }
}

何时将其视为服务定位器或反模式?为什么?我正在考虑第一种方法,仅用于容器提供的依赖性解析。所有汽车都具有相同的类型接口依赖性,实体的主要区别来自于它们如何转换所提供的数据。

每当调用其中一个方法时,我需要指定汽车的新实例,因此可以根据选择转换数据集。

这不是实施,而是我能提供的最简单的例子。

$output = [];

foreach ($car as $key => $data) {
    $newCar = $this->factory->createCar{$key}();

    // Pass Some Data To The New Car Methods So It Can Be Transformed 

    $output[] = $newCar;
}
return $output;

如果这是错误的方法,那么替代选项会是什么?

修改

在进一步挖掘之后,我看到一些IoC容器将工厂callables作为依赖项传递。我打算将每个Car绑定到一个可调用的但是由于能够从方法返回键入提示数据(php7)我可以使用提供程序配置工厂然后从{{1}内调用'callable factory' }。需要额外的绑定,但是无需在每个工厂中引用/依赖注入IoC容器。

仍在研究我很想听听那些有更多经验的人的反馈。

例如:

CarFactory

由于get方法是类型提示(查看原始汽车工厂),当返回的项目未实现// Within Some Registered Provider // I Will Have To Wire Each Car $one = function() use ($app) { return $app->make(CarOne::class); }; $two = function() use ($app) { return $app->make(CarTwo::class); }; $app->bind(ICarFactory::class, function($app) use ($one, $two) { return $app->make($concrete, [$one, $two]); }); // Car Factory Constructor public function __construct(callable $carOne, callable $carTwo) { $this->one = $carOne; $this->two = $carTwo; } 时会抛出错误,每个工厂方法只需要调用'callable factory'(类似这样的{ {1}})。

我相信我解决了外包创建依赖关系的问题(避免在工厂内创建困扰我的地狱),同时仍然遵循“最佳实践”。如果有人提供建议,仍在寻找建议。

0 个答案:

没有答案