Инъекция зависимости в несколько классов? - PullRequest
0 голосов
/ 16 февраля 2019

Предположим, я хочу добавить ObjClass obj в два разных класса: Используя кинжал 2

class A{
   @Inject ObjClass obj
}

class B{
   @Inject ObjClass obj
}

У меня есть компонент и модуль:

@Component @Singleton class InjectorComponent{
   void inject(A a);
   void inject(B b);
}
@Module class InjectorModule{
   @Provides
   @Singleton
   public ObjClass giveObj(){ return new ObjClass(); //This costs A LOT of CPU resources so dont want to call new ObjClass everytime}
}

В моих классах A, B У меня есть метод бегуна, такой как:

void runner(){
  DaggerInjectorComponent comp = DaggerInjectorComponent.builder....
  comp.InjectorModule(new InjectorModule(...)); //IMPORTANT LINE
  comp.inject(this)
}

Меня интересует, будет ли это каждый раз создавать новый Компонент и новый InjectorModule, а также новый ObjClass?Я хочу поделиться одним и тем же экземпляром ObjClass, так как же это сделать?

Всегда ли он создает новый InjectorModule?

1 Ответ

0 голосов
/ 19 февраля 2019

Да, в этом случае вы создадите два экземпляра компонента и модуля;Таким образом, у вас будет два экземпляра ObjClass, даже если вы пометили его как @Singleton.Проблема состоит в том, что зависимые области являются только одиночными в области видимости компонента .Это означает, что создание новых экземпляров компонентов приведет к созданию новых экземпляров зависимостей.Посмотрите на пример: Давайте расширим ваш метод void runner :

void runner(){
  DaggerInjectorComponent comp = DaggerInjectorComponent.builder....
  comp.InjectorModule(new InjectorModule(...)); 
  comp.inject(this) //HERE YOU CREATE AND INJECT YOUR DEPENDENCY
  comp.inject(this) // HERE NOTHING WILL HAPPEN, AS DEPENDENCY IS CACHED
}

После запуска этого кода ваш экземпляр не воссоздается, потому что он помечен как @Singleton, поэтому это зависимость по объему, поэтомуКинжал будет знать, что для этого экземпляра компонента требуется инициализировать этот объект только один раз .

Но если мы воссоздадим или создадим компонент, эта логика перестанет работать:

void runner(){
  DaggerInjectorComponent comp = DaggerInjectorComponent.builder....
  comp.InjectorModule(new InjectorModule(...)); 
  comp.inject(this) //HERE YOU CREATE AND INJECT YOUR DEPENDENCY

  comp = null
  comp = DaggerInjectorComponent.builder.... // component is recreated
  comp.InjectorModule(new InjectorModule(...)); 
  comp.inject(this) // HERE YOUR DEPENDECY IS REINITIALIZED, COMPLETELY NEW OBJECT
}

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

Чтобы исправить это, вы не должны воссоздавать свой компонент.Например, вы можете хранить его где-нибудь в том месте, которое точно не будет воссоздано.

Надеюсь, это помогло.

...