Chciałbym zasugerować wyjaśnienie niektórych terminów, których tu używasz, w szczególności „zależności” i „wstrzykiwania zależności”.
Zależność:
„Zależność” jest zazwyczaj złożonym obiektem, który wykonuje pewne funkcje, od których może zależeć inna klasa. Klasycznymi przykładami mogą być rejestrator lub moduł dostępu do bazy danych lub jakiś komponent przetwarzający określoną logikę biznesową.
Obiekt zawierający tylko dane, taki jak DTO lub obiekt wartości, nie jest zwykle określany jako „zależność”, ponieważ nie pełni on niektórych potrzebnych funkcji.
Gdy spojrzeć na to w ten sposób, co robisz w swoim przykładzie ( komponując ten DOobiekt z listy D02obiektów przez konstruktora) nie powinny być uważane za „zastrzyk dependecy” w ogóle. To tylko ustawienie nieruchomości. Od Ciebie zależy, czy podasz je w konstruktorze, czy w inny sposób, ale przekazanie go przez konstruktor nie spowoduje wstrzyknięcia zależności.
Wstrzykiwanie zależności:
Gdyby twoja DO2klasa faktycznie zapewniała dodatkowe funkcje, których DOpotrzebuje klasa, to naprawdę byłaby to zależność. W takim przypadku klasa zależna DOpowinna zależeć od interfejsu (takiego jak ILogger lub IDataAccessor), a z kolei polegać na kodzie wywołującym, który zapewnia ten interfejs (innymi słowy, „wstrzykuje” go do DOinstancji).
Wstrzyknięcie zależności w taki sposób sprawia, że DOobiekt jest bardziej elastyczny, ponieważ każdy inny kontekst może zapewnić własną implementację interfejsu do DOobiektu. (Pomyśl o testowaniu jednostkowym.)