Или я должен использовать конструктор для их загрузки?В этом примере было бы около 7 объектов для внедрения в другие классы, что выглядит много.Я ошибаюсь?
Когда вы начинаете вводить столько объектов, вам нужно спросить, отвечает ли объект, который их получает, за слишком много.Можно ли его разбить на более мелкие части?
Если это действительно невозможно, рассмотрите возможность инкапсуляции связанных объектов в другом классе.Возможно, ваши сеанс, логгер и объекты конфигурации могут быть внедрены в объект App
или Application
?
Редактировать: Я заметил, что большинство других ответов пока говорят о синглетонах.Обратите внимание, что синглтоны являются врагом DI.Отличный технический доклад Google по этому вопросу здесь .
Редактировать 2:
То, что я имею в виду под инкапсуляцией, вместо введения Session
, Logger
, Config
и т. Д. Все в ваш класс Account
, может быть, они должны быть введены в класс Application
, а экземпляр Application
может быть введен в Account
.
ВЧестно говоря, это все еще часть ДИ, я оборачиваюсь вокруг меня, но то, что я начинаю видеть, таково: вам следует вводить только в Account
объекты, которыми он будет напрямую манипулировать.Этим объектам, возможно, придется манипулировать еще другими объектами, но Account
не нужно знать об этом.
Часто вы обнаружите, что вам даже не нужно столько "слоев", сколькоВы думали, хотя.Если вы обнаружите, что вводите что-то повсюду, подумайте о различных способах реструктуризации вашего приложения.Позвольте мне взять фрагмент кода из документации Pylons для модели:
a = model.Person()
a.name = "Aaa"
a.email = "aaa@example.com"
meta.Session.add(a)
(Не беспокойтесь о meta.Session
... в основном это обрабатывает взаимодействие с базой данных.)
Здесь мы создаем Person
, устанавливаем пару его атрибутов, а затем сохраняем их.Вы заметите, что Person
класс не знает ничего о базе данных, и на самом деле даже не имеет save()
метода.Вместо этого мы передаем его в класс базы данных (meta.Session
), который сохраняет его.Мы отделили заботу о Person
логике от кода базы данных.meta.Session
может работать с дюжиной разных способов, но пока он умеет читать Person
, у нас все хорошо.(в этом случае, во время инициализации приложения, он читает определение всех моделей приложения).
Хорошо, я собираюсь подвести итог, потому что я, очевидно, много здесь прогулял.Не существует одного «правильного» ответа на ваш вопрос (насколько я знаю, но я не провозглашаю себя экспертом DI каким-либо образом).
Да, введение нескольких объектов, вероятно, указывает на некоторыенужно реструктурировать, но у вас есть ряд соображений:
- Является ли объект, получающий инъекцию, ответственным за слишком много;это может быть выделено?
- Вы вводите только те объекты, которые класс получателей должен будет использовать напрямую?
- Вы вводите неправильное направление;Может ли ваш
Account
объект быть введен в ваш Database
, а не наоборот?