Вы читали о достоинствах внедрения зависимости.Почему вы начали его использовать?
Было ли это из-за возможности поменять эти конкретные зависимости для тестирования или в других средах?Было ли это выделить и сделать явным порядок круговой цепочки зависимостей?
Предположим, например, что это было желание вводить разные классы для целей тестирования (заслуга DI заставила меня его использовать).Как вы справляетесь с этим без DI?
Посмотрите на свой класс учетной записи.Вы можете либо изменить конструктор с помощью проверки if для некоторого предиката testMode (), либо вы можете изменить конструкторы Db и Session, либо вы можете изменить файл конфигурации.Какое решение не DI вы выберете, вы согласны с этим?А как насчет других зависимостей (emailer, logger и т. Д.)?Есть ли у вас какие-либо интерфейсы к внешним системам, которые вы должны использовать для тестирования?
В любом случае, ответом может быть то, что вы удовлетворены без DI-решения и что ваше приложение достаточно маленькое, чтобы обходиться без него.Но все равно важно задать себе вопрос.
Точно так же примените ту же самую линию вопросов к другим достоинствам DI, побудившим вас начать его использовать.
Кстати, у вас есть одинэкземпляр Db в учетной записи и другой в каждом из ваших других классов?Не могли бы вы иметь только один экземпляр?Д. помогает с этим.Вы можете иметь одноэлементные классы, фактически не кодируя их как синглетоны, всегда внедряя один и тот же экземпляр.
Из любопытства, почему вы делаете собственное внедрение зависимостей вместо использования библиотеки DI?Половина преимущества использования DI состоит в том, что он полностью абстрагируется от реализации других людей.Пишите только тот код, который вам нужен, и пусть библиотеки позаботятся о том, чтобы сделать за вас инъекцию.Это похоже на предложение drrcknlsn, но без написания фактической реализации класса DependencyInjectionContainer:
$ account = DependencyInjectionContainer :: build ('Account');
и привинтить остальные.
Хорошая библиотека DI должна видеть конструктор для Account, понимать, что ей нужны Db и Session, и продвигаться по цепочке конструкторов (в этом случае она заканчивается там, поскольку оба имеют пустые конструкторы).Это означает наличие того же объема кода, что и в случае без DI (плюс аргументы для конструктора, минус обращения к конструкторам внутри, но без лишней хрени наверху), с какими бы преимуществами вы ни привели вас в DI.