Как использовать Dagger 2 в SDK? - PullRequest
       4

Как использовать Dagger 2 в SDK?

0 голосов
/ 21 сентября 2018

У меня есть основное приложение, которое использует Dagger (некоторая предыдущая версия) для предоставления зависимостей.

Теперь я пишу SDK, где я использую (Dagger 2.10+).Все работает нормально, когда у меня есть класс приложения, как у приложений (HasActivityInjector) и он отвечает за инициализацию DaggerAppComponent.

Мой вопрос -

  • Должен ли я использовать Dagger2 в моем SDK (я хочу, потому что это делает мой код более тестируемым)
  • Если нет, то я рассматриваю возможность написания своего собственного класса Injection.
  • Если я пойду на это, как мне это сделать?инициализация на уровне приложения, поскольку единственное решение, которое я обнаружил, - это иметь класс Application в sdk и заставить клиента расширять его.(Я не хочу, чтобы это изменение на стороне клиента и не хороший дизайн).

Любые предложения будут великолепны !!

1 Ответ

0 голосов
/ 17 января 2019

Мне недавно пришлось решить ту же проблему:
Создать SDK, который можно использовать в любом поддерживаемом приложении для Android .

IЯ должен был принять предпосылку, что некоторые из приложений, которые захотят использовать SDK, сами не будут использовать Dagger или даже внедрение зависимостей.

Основная проблема с созданием SDK, который использует внедрение зависимостей, заключается в том, чтоКак указывал OP, реализация Application в приложении.

Отчасти причина создания HasActivityInjector, HasFragmentInjector или HasSupportFragmentInjector была необходимостьсоблюдать следующее правило внедрения зависимостей:

Класс не должен ничего знать о том, как он внедряется. Ссылка A


С созданием интерфейсов HasXInjector Android позволяет приложить к приложению граф зависимостей кинжала, а затемчтобы приложение отвечало за внедрение зависимостей, когда их нужно вводить с помощью следующего кода:

AndroidInjection.inject(this) // <-- 'this' being an Activity or Fragment


ВЫПУСК SDK
Проблема заключается в том, что в SDK нетРеализация приложения самостоятельно.Кроме того, SDK не может ничего добавить к реализации приложения в приложении и не может переопределить реализацию приложения в приложении.В случае внешнего SDK он даже не узнает о реализации приложения, а только об интерфейсе приложения.

Так что даже если приложение, включающее SDK, использует Dagger, что не гарантируется,SDK не сможет добавить свой граф зависимостей к графу зависимостей, используемому реализацией приложения приложения, что сделает все зависимости SDK недоступными.
И если приложение не использует Dagger, как эти зависимости будут внедрены в первую очередь?

Мое собственное решение этой проблемы состояло в том, чтобы нарушить указанное выше правило и не использовать HasActivityInjector, HasFragmentInjector или HasSupportFragmentInjector для внутреннего внедрения в SDK.

...