Как передать параметры конструктору зависимости из зависимого класса? Создать провайдера?

Например, мой DependentClass зависит от некоторых AbstractCsv учебный класс.
Вот декларация AbstractCsvФабрика (http://csv.thephpleague.com/instantiation/):

public static AbstractCsv::createFromFileObject(SplFileObject $obj): AbstractCsv

А вот и декларация DependentClassконструктор:

class DependentClass {
public function __construct(AbstractCsv $csv) { /* implementation... */ }
// implementation...
}

Как вы можете видеть, чтобы создать экземпляр AbstractCsvМне нужно передать в случае SplFileObject к заводской функции зависимости AbstractCsv::createFromFileObject, Чтобы создать SplFileObjectМне нужно имя файла. DependentClass хранит необходимое имя файла (или, например, имя файла рассчитывается динамически в DependentClass во время выполнения).

Как я могу передать экземпляр AbstractCsv в DependentClassконструктор, если:

  • имя файла определяется внутри DependentClass сам,
  • а также создать экземпляр AbstractCsvУ меня сначала есть
    создать SplFileObject а затем AbstactCsv? Это
    замкнутый круг!

В настоящее время я вижу единственное решение, чтобы разорвать этот круг: DependentClass не должно зависеть от AbstractCsv, но на его фабрике, которая обеспечит экземпляр AbstractCsv в DependentClass по запросу, по требованию. Это также избавит от необходимости создавать SplFileObject в пределах DependentClass:

class DependentClass {
public function __construct(CsvProvider $csvProvider) { /* implementation... */ }
// implementation...
public function someMethod($value) {
$filename = rand($value); // somehow calculate $filename
$csvFile = $this->csvProvider($filename);
$csvFile->fwrite($someData);
}
}

class CsvProvider {
public function get(string $filename) : AbstractCsv {
return AbstractCsv::createFromFileObject(new SplFileObject($filename));
}
}

Я думаю, что эта проблема распространена и встречается очень часто, верно? В настоящее время я новичок в DI, поэтому я задаюсь вопросом: действительно ли это решение является правильным способом решения этой проблемы? И как называются такие заводы? Я назвал это provider, Это правильный термин для этого?

0

Решение

Задача ещё не решена.

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

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

По вопросам рекламы [email protected]