На Android, точно следовать совету, который вы цитировали от Роберта Мартина, довольно сложно.
Это потому, что нет точной main
точки входа. Application
, Service
и Activity
являются квазипунктовыми точками, поскольку ваше приложение будет запускаться с ОС, создающей один из них.
Однако вы не можете контролировать конструктор или что-либо еще до обратных вызовов жизненного цикла. Следовательно, Dagger 2 на Android должен был полагаться на ручной вызов, запрашивающий Компонент и вызов Component#inject()
в точках квазидоступа обратных вызовов жизненного цикла.
Однако были предприняты некоторые меры для решения этой проблемы. Dagger- Android позволяет решить эту проблему, заставляя вас зависеть от AndroidInjector
, а не от серии вызовов Application
для извлечения компонента вручную.
Более того, теперь есть FragmentFactory
, который позволяет контролировать конструктор фрагмента, делая фрагменты пригодными для внедрения конструктора. Если мы используем это, то мы пошли некоторым путем, следуя совету Роберта Мартина.
Чтобы уточнить исходную цитату, я считаю, что Роберт Мартин означает, что классы, кроме компонента root, не должны быть загрязнены логиками * 1034. * для получения зависимостей (например, путем проникновения в Application
, извлечения компонента кинжала). Он не запрещает использование аннотации @Inject
, которая представляет собой облегченные метаданные (часть JSR-330 ), которая просто помечает конструктор как сайт для внедрения.
В заключение да, нынешний способ использования Dagger 2 на Android не совсем соответствует превосходной рекомендации Роберта Мартина. Тем не менее, это известная проблема, и к ее решению был достигнут некоторый прогресс.