Для DI используем вот такой подход: в Application есть ссылка на ComponentManager. Его задача инициализировать и отдавать компоненты по запросу. Есть BaseComponent который предоставляет базовые зависимости, которые нужны везде. Его мы обычно singleton скопом помечаем. Далее используем subComponent с другими скопами, жизненым циклом которых мы управляем сами через componentManager. SubComponent продумываем таким образом, чтобы он использовался для конкретных задач логически связанных. Например нам нужен компонент, который будет предоставлять зависимости только для работы с новостройками (это из нашего проекта). Т.е этот компонент предоставляет нам модели для работы с новостройками/конкретной новостройкой, фильтрами и т.д. Соответственно нужно понимать когда и как нам инициализировать компонент. Для этого нужно понять кто в связке MVP кого создает. Презентер создает View, соответственно и вью должна позаботиться о его иниализации так, как нужно. Пускай это будет даггер. Но нам нужен компонент. Вот тут идет в ход componentManager и subComponent. Мы открываем активити и в методе onCreate просим componentManager предоставить нужный компонент. Пусть будет BuildingsComponent. Чтобы память не текла нужно сабкомпоненты занулять когда активити финиширует (это делает все тот же componentManager, т.к ссылки на компоненты хранятся в нем). Через аннотацию providePresenter мы создаем презентер и инжектим в него то, что нам нужно либо через конструктор, либо через Component.injext(Presenter), либо через сеттеры. Тут дело вкуса. Если хотите тестами покрывать презентеры, то делайте через конструктор или сеттеры. Елсли не хотите тестами покрывать и усложнять себе жизнь методами с аннотацией providePresenter то делайте инжект прямо в презентере. Тут кто-то уже показывал кусок кода. Вьюхолдеры у нас без презентеров. Нам всегда хватает одного презентера на экран.