Я довольно новичок в достойном ООП и DI, поэтому было интересно, если следующий пример и его шаблон инициализации моего класса начальной загрузки, который включает в себя зависимые объекты, действительно удобны в использовании, например:
new Session( new Config, new Database ( new Config ), new Page ( new Config ), new Statistics ( new Database ( new Config ) ), new Notification, new Filter );
Я считаю, что те, кто знаком с DI, могли что-то сказать о куске кода выше в объекте начальной загрузки?
Это выглядит немного громоздким, но все в порядке? Так ли это, что мы могли бы назвать это хорошо / правильным / приемлемым ?
После некоторого времени изучения исследования по новой проблеме я, наконец, пришел к выводу, что для моего случая лучшим контейнером для инъекций зависимостей будет:
Dice – минималистский контейнер для инъекций для PHP.
У этого есть только один файл, и для того, чтобы иметь код, это из моего вопроса, который будет инициализирован, все, что вам нужно:
(new Dice)->create('Session');
Dice DIC позаботится обо всем остальном. Вы можете прочитать больше о Dice на домашней странице Tom Butler (разработчик).
Я лично считаю, что это лучший (самый короткий и простой) способ инъекции зависимостей и должен быть встроен в PHP по умолчанию, и я действительно задаюсь вопросом, почему это не так?
Чтобы отделить ваш код от конкретного контейнера инъекций зависимостей, я бы рекомендовал использовать специальную оболочку класса:
class DIC extends Dice { function __construct( $component, array $args = array(), $callback = null, $forceNewInstance = false ) { return parent::create( $component, $args, $callback = null, $forceNewInstance = false ); } }
что также поможет еще более сократить процесс инициализации, что-то действительно невероятно удивительное.
Теперь, чтобы создать сложные множества DI, например:
new Session( new Config, new Database ( new Config ), new Page ( new Config ), new Statistics ( new Database ( new Config ) ), new Notification, new Filter );
Все, что вам нужно сделать, это:
new DIC('Session');
Если вы хотите передать параметр конструктору, вы можете пойти с:
new DIC('Session', array($param));
Я не знаю, что думают другие, но я нахожу это удивительным (по крайней мере, до сих пор, от того, где я нахожусь сегодня).
Спросите вас, будьте любезны, комментируя возможные недостатки, с которыми я мог столкнуться в будущем, используя эту DIC (Dice) или этот метод в целом !?