Я хотів би запропонувати уточнити деяку термінологію, яку ви використовуєте тут, зокрема "залежність" та "введення залежності".
Залежність:
"Залежність", як правило, є складним об'єктом, який виконує певну функціональність, від якої може знадобитися інший клас. Деякі класичні приклади - це реєстратор або аксесуар до бази даних або якийсь компонент, який обробляє певний фрагмент бізнес-логіки.
Тільки дані об'єкт , як DTO або об'єкт значення не має , як правило , згадується як «залежність», так як вони не виконують деякі необхідні функції.
Після того, як ви дивитеся на це таким чином, що ви робите у вашому прикладі ( складаючи в DO
об'єкт зі списком D02
об'єктів через конструктор) не слід розглядати як «ін'єкції залежних пакетів » на всіх. Це просто встановлення властивості. Ви вирішуєте, надаєте ви це в конструкторі чи іншим способом, але просто передача його через конструктор не робить його введенням залежності.
Ін'єкційна залежність:
Якби ваш DO2
клас насправді забезпечував якусь додаткову функціональність, яка DO
потрібна цьому класі, це справді було б залежністю. У цьому випадку залежний клас, DO
повинен залежати від інтерфейсу (наприклад, ILogger або IDataAccessor), і, в свою чергу, покладатися на викликовий код для надання цього інтерфейсу (іншими словами, "ввести" його в DO
екземпляр).
Введення залежності таким чином робить DO
об'єкт більш гнучким, оскільки кожен різний контекст може забезпечити власну реалізацію інтерфейсу для DO
об'єкта. (Подумайте про тестування блоку.)