假设我有一个工厂通过方法返回不同的类。
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}})。
我相信我解决了外包创建依赖关系的问题(避免在工厂内创建困扰我的地狱),同时仍然遵循“最佳实践”。如果有人提供建议,仍在寻找建议。