Чтобы использовать Dependency Injection, ваши классы должны иметь свои инъекции (несколько способов сделать это - конструктор, свойство) и не создавать их сами, как вы примеры.
Кроме того, можно извлечь интерфейс каждой зависимости, чтобы помочь с тестируемостью, и использовать интерфейс вместо типа реализации в качестве зависимости.
class Foo
{
private IExternalDependency ed;
public int doSomethingWithExternalDependency() {...}
public Foo(IExternalDependency extdep)
{
ed = extdep;
}
}
Большинство людей используют mocking framework для проверки зависимостей при тестировании.
Вы можете смоделировать любой объект, от которого зависит тестируемый класс (включая поведение и возвращаемые значения) - передать макеты в класс как его зависимости.
Это позволяет вам тестировать класс, не полагаясь на поведение его (реализованных) зависимостей.
В некоторых случаях вы можете использовать подделки или заглушки вместо насмешливого фреймворка. См. эту статью Мартина Фаулера о различиях.
Что касается получения всех зависимостей, полностью вниз - используется контейнер IoC . Это реестр всех зависимостей в вашей системе, и он понимает, как создавать экземпляры каждого класса со своими зависимостями.