Задать вопрос

IoC в PHP, как ему лучше объяснить, какой объект инициализировать?

Есть некий мини велосипедный Inversion of Control объект. То-есть когда он создается классы вот таким вот образом
IoC->Create('Model_Test');
То автоматом инициализируется все зависимые классы.
IoC->Create('Model_Test'); = new Model_Test(new DB, new Model_Test3);

Правда их инициализирует сам класс(точнее методы реализованы в базовом классе), таким образом это больше Service Locator конечно или даже Class Factory но не в этом суть. Вопрос вот в чем

Исходя из правильности подхода какие классы должны быть инициализированные определяются на основе ранее привязанных к ним интерфейсов. То-есть если в конструкторе идет IBaseDB интерфейс и мы привязали его ранее к классу BaseDB то при инициализации понятно что нужно его пихать.

Беда в следующем, если у нас есть 2 подключения к базе одновременно. То-есть этот интерфейс IBaseDB реализует одновременно 2 класса. Тогда перед самым вызовом нужно связывать этот интерфейс с другим классом, создавать класс а потом связывать обратно или возможно есть лучший путь?

Есть еще вариант сделать еще 1 интерфейс с другим именем и тогда при инициализации класса не нужно будет делать дополнительные связи. Но такой подход кажется неправильный так как придется делать полный дубль первого интерфейса со всеми его методами.
  • Вопрос задан
  • 2607 просмотров
Подписаться 3 Оценить 4 комментария
Решения вопроса 1
Есть еще вариант сделать еще 1 интерфейс с другим именем и тогда при инициализации класса не нужно будет делать дополнительные связи. Но такой подход кажется неправильный так как придется делать полный дубль первого интерфейса со всеми его методами.

//Допустим есть базовый интерфейс:
interface IBaseDB{
    // здесь список методов
}
//Просто наследуем 2 пустых интерфейса от него:
interface IBaseDBLogDB extends IBaseDB{}
interface IBaseDBMasterDB extends IBaseDB{}
//и Забиваем их в IoC:
$IoC->Bind('IBaseDBLogDB',$log_db_connection_instance);
$IoC->Bind('IBaseDBMasterDB',$master_db_connection_instance);

Не вижу здесь дублирования кода, на мой взгляд вполне жизнеспособное решение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы