Может ли Кинжал использоваться для выполнения инъекции в Провайдере контента?

Недавно я интегрировал Кинжал в проект, который использует ContentProviders. Я создаю один экземпляр объекта ObjectGraph в своем пользовательском объекте приложения и в основном в каждом управляемом компоненте:

  • Активность,
  • Фрагмент
  • Сервис

... Затем я вызываю getApplication(), опускаясь к своему пользовательскому объекту приложения и принудительно впрыскивая через некоторую пользовательскую реализацию в своем классе Application. Это, по-видимому, предписанный метод выполнения инъекций, основанный на образцах, которые я видел, опубликованных ребятами на площади.

Этот шаблон не выполняется для экземпляров ContentProvider, хотя, поскольку их жизненный цикл не так предсказуемо привязан к жизненному циклу объекта Application, то есть ContentProviders могут быть и, как я часто наблюдаю, создаются до того, как объект Application (по причинам, которые я еще не понял).

Итак... у кого-нибудь есть хороший способ инъекции ContentProviders с использованием кинжала? Я до сих пор это сделал, имея вызов isInjected() в начале каждого из моих методов интерфейса ContentProvider (вставка, запрос, обновление, удаление)... в основном хакерская форма ленивой инициализации. Но это кажется далеким от идеала. Существует ли более предписанный подход к инъекции ContentProviders?

Ответ 1

Подкласс Application - это просто соглашение, так как обычно создается первый объект. В наших приложениях нет поставщиков контента, поэтому мы их используем. Там ничего, что говорит, что вы не можете поместить его в другое место.

Вы можете просто использовать традиционный одноэлементный шаблон для создания и хранения ссылки на ObjectGraph.

public final class Dagger {
  static ObjectGraph og;

  static ObjectGraph og() {
    if (og == null) {
      og = ObjectGraph.create(..);
    }
    return og;
  }
}

Первый доступ для доступа инициализирует экземпляр, который будет использоваться для времени жизни процесса.

Если ваш контент-провайдер находится в другом процессе, чем ваше основное приложение, это решение по-прежнему будет работать. Или вы можете просто создать график, когда ваш контент-провайдер будет создан, так как он будет единственным потребителем. Разумеется, нормальные правила многопроцесса все же применяются, поэтому никакие экземпляры не будут использоваться совместно с другими процессами.