Как лучше использовать Dagger, если вы пытаетесь использовать чистую архитектуру? - PullRequest
4 голосов
/ 10 апреля 2020

В «Чистой архитектуре» Роберт Мартин говорит:

Именно в вашем главном компоненте зависимости должны вводиться структурой внедрения зависимостей. Как только они введены в Main, Main должен распределить эти зависимости нормально, без использования каркаса.

Martin, Robert C .. Чистая архитектура (Robert C. Martin Series) (стр. 232). Пирсон Образование. Kindle Edition.

Однако Dagger не работает таким образом. После того, как вы настроили свои зависимости в своем приложении, вам все еще нужно зависеть от него как от платформы, например, написать аннотации @Inject, чтобы получить зависимости в ваших классах. Нет никакого способа «нормально распределить эти зависимости», и я предполагаю, что он подразумевает передачу их через конструктор?

Может кто-нибудь помочь прояснить мое понимание и как лучше использовать Dagger со стилем Clean?

1 Ответ

2 голосов
/ 12 апреля 2020

На Android, точно следовать совету, который вы цитировали от Роберта Мартина, довольно сложно.

Это потому, что нет точной main точки входа. Application, Service и Activity являются квазипунктовыми точками, поскольку ваше приложение будет запускаться с ОС, создающей один из них.

Однако вы не можете контролировать конструктор или что-либо еще до обратных вызовов жизненного цикла. Следовательно, Dagger 2 на Android должен был полагаться на ручной вызов, запрашивающий Компонент и вызов Component#inject() в точках квазидоступа обратных вызовов жизненного цикла.

Однако были предприняты некоторые меры для решения этой проблемы. Dagger- Android позволяет решить эту проблему, заставляя вас зависеть от AndroidInjector, а не от серии вызовов Application для извлечения компонента вручную.

Более того, теперь есть FragmentFactory, который позволяет контролировать конструктор фрагмента, делая фрагменты пригодными для внедрения конструктора. Если мы используем это, то мы пошли некоторым путем, следуя совету Роберта Мартина.

Чтобы уточнить исходную цитату, я считаю, что Роберт Мартин означает, что классы, кроме компонента root, не должны быть загрязнены логиками * 1034. * для получения зависимостей (например, путем проникновения в Application, извлечения компонента кинжала). Он не запрещает использование аннотации @Inject, которая представляет собой облегченные метаданные (часть JSR-330 ), которая просто помечает конструктор как сайт для внедрения.

В заключение да, нынешний способ использования Dagger 2 на Android не совсем соответствует превосходной рекомендации Роберта Мартина. Тем не менее, это известная проблема, и к ее решению был достигнут некоторый прогресс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...