Что это в основном означает для аннотаций области действия в двух компонентах (один зависит от другого) - PullRequest
0 голосов
/ 19 октября 2019

В моем проекте Android у меня есть два модуля проекта, модуль main и модуль core.

В основном модуле у меня есть компонент кинжала, MainComponent:

 // it has dependency on CoreComponent
@Component(modules = [MyModule::class], dependencies = [CoreComponent::class])
@FeatureScope
interface MainComponent {
    fun inject(mainActivity: MainActivity)
}

Как вы можете видеть выше, MainComponent зависит от CoreComponent. Он также имеет пользовательскую аннотацию области действия @FeatureScope.

В модуле core У меня есть еще один компонент кинжала, который называется CoreComponent:

@Component(modules = [CoreModule::class])
@Singleton
interface CoreComponent {
    fun getExpensiveObject(): ExpensiveObject
}

@Module
class CoreModule {
    @Provides
    @Singleton
    fun provideExpObj(): ExpensiveObject = ExpensiveObject()
}

. CoreComponent аннотируется определенным кинжалом@Singleton scope.

Я создаю основной компонент в onCreate() из Application класса:

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
          //build main component along with core component
         mainComponent = DaggerMainComponent
                .builder()
                .myModule(MyModule())
                .coreComponent(DaggerCoreComponent.builder().build())
                .build()
     }
}

CoreComponent, а его провайдеры аннотируются @Singleton, тогда как MainComponent и ее провайдеры аннотированы пользовательской аннотацией @FeatureScope.

Вопрос первый: С точки зрения времени жизни код означает, что время жизни объектов в MainComponent короче, чем вCoreComponent из-за аннотаций области действия (@Singleton в CoreComponent и @FeatureScope в MainComponent)?

Вопрос второй: Поскольку компоненты встроены в Application класс onCreate()что является точкой входа приложения во время выполнения, я прав, что хотя компоненты в двух модулях проекта аннотируются различными областями аннотации, их объекты в основном имеют то же время жизни, что и все приложение во время выполнения?

(Iзадать эти вопросы, потому что му вас есть понимание, что область, определенная кинжалом @Singleton, имеет самый длинный срок службы, но я путаюсь с моим проектом)

1 Ответ

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

Да, тот факт, что CoreComponent помечен @Singleton, а экземпляр компонента создан в Application, означает, что во время жизни приложения будет создан единственный ExpensiveObject.

Относительно пользовательской аннотации (@FeatureScope)

Реализация компонента гарантирует, что существует только одно предоставление каждой привязки области действия на экземпляр компонента. ref

Но поскольку MainComponent создается только один раз для каждого приложения, эта пользовательская аннотация фактически совпадает с аннотацией Singleton.

Если вы хотите объект с функциональной областью, то вы должны удалить его из MainComponent и иметь эту аннотацию только для подкомпонента. Прочитайте учебник по кинжалу, и, в частности, step 13 .

Обозначение WithdrawalLimiter и UserCommandsRouter с @PerSession указывает на Dagger, что один WithdrawalLimiter должен бытьсоздается для каждого экземпляра UserCommandsRouter.

@PerSession
final class WithdrawalLimiter { ... }

@PerSession
@Subcomponent(...)
interface UserCommandsRouter { ... }
...