Мої два центи тут:
Я переробляю PHP-додаток, і я намагаюся зробити якомога більше ін'єкцій залежності
Ви не заявляєте, якщо використовуєте рамку введення залежності. Я думаю, що ти обов'язково повинен. Використовуйте щось, що надає потрібні вам функції: /programming/9348376/guice-like-dependency-injection-frameworks-in-php .
Проблема, з якою я зіткнувся, полягає в тому, в якому моменті я можу створити нові об'єкти? Схоже, я опишусь на вищому рівні, створюючи безліч нових об'єктів, оскільки більше немає куди йти. Це відчуває себе неправильно.
Зазвичай ви використовуєте конфігурацію або центральну точку для створення оригіналів об'єктів, що складають вашу програму. Контейнер створить об'єкти для вас.
Потім ви отримуєте доступ до об'єктів (послуг, постачальників, контролерів ...) через контейнер IoC. Це буде прозоро створити об’єкт для вас, якщо це потрібно, або дасть вам посилання на відповідний існуючий екземпляр.
Звичайно, всередині вашої конкретної реалізації об'єктів ви можете інстанціювати інші об'єкти, для яких вам не потрібен DI (структури даних, користувацькі типи тощо), але це нормальне програмування.
Я читав деякі блоги, які використовують фабричні класи для створення всіх об'єктів, а потім ви вводите завод до інших класів. Потім ви можете зателефонувати до заводських методів, і фабрика створить новий об’єкт для вас.
Зазвичай ви використовуєте Factory, якщо ви хочете, щоб IoC-рамка створювала деякі об'єкти IoC через ваші фабрики (це потрібно, коли інстанціювання певного об'єкта вимагає додаткової роботи). Якщо ви можете просто створити свої об'єкти за допомогою "нового об'єкта ()" та встановити деякі властивості, не обов'язково потрібно використовувати заводський шаблон.
Іншими словами, я б сказав, що використання фабричного шаблону для класу або групи класів залежить від того, як ви хочете моделювати ці класи, а не від того, чи використовуєте ви DI (якщо ваша реалізація DI явно не вимагає фабрик, що незвично).
Ви також налаштовуєте свій IoC-фреймворк для використання Factory, коли ви використовуєте сторонній ліб, який вже вимагає використання Factory. У цьому випадку у вас немає контролю над цим, і вам потрібно сказати своєму контейнеру IoC: "Ей, коли я запитую один з цих інтерфейсів, ви повинні використовувати цю фабрику, щоб надати мені відповідний екземпляр".
Моє занепокоєння робити це зараз, коли мої фабричні заняття стануть новим безкоштовно для всіх! Я думаю, це може бути нормально, оскільки це фабричні класи, але чи є якісь правила, яких слід дотримуватися при використанні фабричного візерунка та DI, або я відхиляюсь від позначки тут.
У цьому випадку здається, що вам не потрібно використовувати заводські зразки для цих об’єктів / служб / контролерів / будь-що, і ви можете просто налаштувати свій IoC для створення «нового» відповідного класу та введення всього іншого.
Я сподіваюся, що це допомагає.