Связан ли компонент Dagger с объектом, который его создает? - PullRequest
0 голосов
/ 18 октября 2019

Я использовал Dagger 2 в своем проекте. Я понимаю, что время жизни объекта области действия совпадает с временем жизни компонента (с той же областью действия). А как насчет времени жизни компонента?

Например, у меня есть компонент:

@MyApp
@Component(modules = {
        ApplicationModule.class})
public interface ApplicationComponent {
    // Injection methods
    void inject(MyApplication mainApplication);
}

Я строю компонент по:

public class MyApplication extends Application {

   @Override
    public void onCreate() {
        super.onCreate();
        buildApplicationComponent();
        mApplicationComponent.inject(this);
    }

    private void buildApplicationComponent() {
        mApplicationComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .build();
    }

}

В настоящее время код дляКомпонент сборки находится в классе Application. Но так ли это, что если я соберу компонент в Fragment, ApplicationComponent будет иметь то же время жизни, что и фрагмент, и если я выполню его в Application классе, то у компонента будет то же время жизни, что и у всего приложения? Или как определяется время жизни компонента?

1 Ответ

0 голосов
/ 18 октября 2019

Это простая Java. У вас есть объект независимо от того, где. Объект предоставляет вам зависимости. Если вы используете один и тот же экземпляр, у вас будут те же зависимости или в основном та же «Область действия / время жизни». Если вы создаете где-то новый объект, это означает новый другой объект \ зависимости, которые он может предоставить, так что «другая область действия / время жизни». Если вы разделяете объект между различными объектами (вы создаете его в классе Application, но повторно используете его в другом фрагменте), вы находитесь в «той же области действия / времени жизни».

Но в целом я вижу только «старый способ» использования Dagger 2 здесь. Вот так ваши занятия должны заканчиваться повсюду. Нет необходимости искать ссылки на какие-либо Компоненты и т. Д. Или пытаться создавать их экземпляры самостоятельно или очищать их самостоятельно в Фрагментах или Актуальностях. У вас есть некоторый код для Dagger 2 в одном месте, а затем несколько аннотаций в ваших классах, «которые выполняют реальную работу вашего проекта». Нет необходимости в сложной "связи" между двумя частями, и я вижу здесь много подобных случаев, которые являются частью учебных пособий, которые относятся к 2016-2017 гг. ...

class Repostory @Inject constructor(
private val dependency1: Dependency1 
) {}

class Activity or Fragment {
@Inject lateinit var dependency2: Dependency2
}

Это отличный примердля правильного использования Dagger2.

https://github.com/google/iosched

Вот статья о приложении:

https://medium.com/@JoseAlcerreca

Хосе Альсеррека является одним изGoogle Lead Devs отвечает за создание руководств по написанию приложений для Android.

@Module
abstract class ActivityBindingModule { 
  @ActivityScoped
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    internal abstract fun mainActivity(): MainActivity
}

Просто попробуйте скомпилировать что-нибудь подобное. В приложении, которое я вам дал, есть такой же класс. Проверьте сгенерированный код, а также документы. Если вы видите ContributesAndroidInjector, там объясняется:

Создает {@link AndroidInjector} для возвращаемого типа этого метода. Инжектор реализован с помощью {@link dagger.Subcomponent} и будет дочерним по отношению к компоненту {@link dagger.Module}.

Если вы посмотрите документы AndroidInjector, вы увидите, чтоэто тот, кто вводит активность. И там будет реализация:

@Subcomponent(modules = {MainActivityModule.class})
  @ActivityScoped
  public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
  }

Так что в общем эти аннотации делают магию для вас, когда начинается новое действие. Они создают подкомпонент, используют его, и когда жизненный цикл действия заканчивается, подкомпонент также не работает. Кинжал очищает ссылку. Кинжал знает, как работают Деятельности или Фрагменты и т. Д. Был старый способ, когда вы создаете компонент в Деятельности, используете его, вызываете инъекцию самостоятельно. Или поместите какой-нибудь компонент в AppClass, а затем очистите его на своем компьютере. Но теперь есть больше аннотаций.

...