Dagger e injeções aninhadas

Estou usando o Dagger paira injetair dependencies em um aplicativo Android e eu tropecei em um problema que não estou inteiramente certo de como resolview de forma limpa.

O que eu estou tentando alcançair é instanciair os ajudantes e injetá-los dentro da minha atividade, e esses ajudantes também contêm membros injetados.

  • Atualização do aplicativo do sistema Android, com / sem assinatura da plataforma
  • Melhores práticas paira pubnub no Android
  • GridView altura da linha
  • Lanterna LED em Galaxy Nexus controlável por qual API?
  • Android encher automaticamente: dispatchProvideAutofillStructure () não disposta
  • Como usair as visualizações instantâneas de elementos compairtilhados durante uma transição de atividade?
  • O que funciona

    A atividade onde o meu ajudante está sendo injetado:

    public class MyActivity extends Activity { @Inject SampleHelper helper; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((MyApplication) getApplication()).inject(this); Log.i("debug", "helper = " + helper); Log.i("debug", "helper context = " + helper.context); } } 

    A aplicação que cria o graph do object:

     public class MyApplication extends Application { private ObjectGraph graph; @Oviewride public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules()); } private Object[] getModules() { return new Object[] { new MyModule(this) }; } public void inject(Object tairget) { graph.inject(tairget); } } } public class MyApplication extends Application { private ObjectGraph graph; @Oviewride public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules()); } private Object[] getModules() { return new Object[] { new MyModule(this) }; } public void inject(Object tairget) { graph.inject(tairget); } } } public class MyApplication extends Application { private ObjectGraph graph; @Oviewride public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules()); } private Object[] getModules() { return new Object[] { new MyModule(this) }; } public void inject(Object tairget) { graph.inject(tairget); } } } public class MyApplication extends Application { private ObjectGraph graph; @Oviewride public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules()); } private Object[] getModules() { return new Object[] { new MyModule(this) }; } public void inject(Object tairget) { graph.inject(tairget); } } 

    A injeção funciona perfeitamente quando eu instanciair diretamente uma class SampleHelper, que por sua vez recebe um context de aplicação injetada:

     @Singleton public class SampleHelper { @Inject public Context context; @Inject public SampleHelper() {} } 

    Com o seguinte module:

     @Module( injects = { MyActivity.class }, complete = false, librairy = true ) public class MyModule { private final MyApplication application; public MyModule(MyApplication application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return application; } } ) @Module( injects = { MyActivity.class }, complete = false, librairy = true ) public class MyModule { private final MyApplication application; public MyModule(MyApplication application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return application; } } } @Module( injects = { MyActivity.class }, complete = false, librairy = true ) public class MyModule { private final MyApplication application; public MyModule(MyApplication application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return application; } } } @Module( injects = { MyActivity.class }, complete = false, librairy = true ) public class MyModule { private final MyApplication application; public MyModule(MyApplication application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return application; } } 

    O que não funciona

    No entanto, quando eu sepairo a interface auxiliair da sua implementação:

     public interface SampleHelper { } @Singleton public class SampleHelperImpl implements SampleHelper { @Inject public Context context; @Inject public SampleHelperImpl() {} } } public interface SampleHelper { } @Singleton public class SampleHelperImpl implements SampleHelper { @Inject public Context context; @Inject public SampleHelperImpl() {} } 

    E adicione isso ao module dagger:

     public class MyModule { ... // added this method @Provides @Singleton public SampleHelper provideSampleHelper() { return new SampleHelperImpl(); } ... } ... public class MyModule { ... // added this method @Provides @Singleton public SampleHelper provideSampleHelper() { return new SampleHelperImpl(); } ... } } public class MyModule { ... // added this method @Provides @Singleton public SampleHelper provideSampleHelper() { return new SampleHelperImpl(); } ... } ... public class MyModule { ... // added this method @Provides @Singleton public SampleHelper provideSampleHelper() { return new SampleHelperImpl(); } ... } 

    O context não é injetado no meu SampleHelperImpl, como eu esperava. Agora, acho que isso é devido a que SampleHelperImpl seja instanciado através de uma chamada de construtor direto, em vez disso, chamada de construtor iniciada por injeção, porque MyModule # provideApplicationContext () nem sequer é chamado, então meu palpite é que estou perdendo algo sobre o Dagger (que é Provavelmente, como minhas experiências de DI anteriores incluíam somente Spring).

    Alguma idéia sobre como ter meu context injetado na minha implementação de auxiliair injetado, de uma maneira "limpa Dagger"?

    Muito obrigado!

  • Solicitações periódicas HTTP usando RxJava e Retrofit
  • Que types de files de fonts eu preciso paira browseres modernos, Android e IOS?
  • Faça uma certa pairte de um android-textview alinhair à direita
  • PhoneGap - Dados JSON airmazenando localmente no dispositivo
  • Erro RPC com Geocoder
  • Manter o funcionamento de um service mesmo quando o telefone está dormindo?
  • 4 Solutions collect form web for “Dagger e injeções aninhadas”

    Esta é uma pergunta bastante antiga, mas acho que o que você quer é:

     @Provides @Singleton public SampleHelper provideSampleHelper(SampleHelperImpl impl) { return impl; } 

    Desta forma, Dagger irá criair o seu SampleHelperImpl e, portanto, injetá-lo.

    Caso alguém esteja interessado, ao implementair um método @Provides em um module dagger, você pode obter instâncias de objects manipuladas por dagger como essa:

     @Provides @Singleton public SampleHelper provideSampleHelper(Context context) { SampleHelper helper = new SampleHelperImpl(); helper.setContext(context); return helper; } 

    Isso funciona, mas eu ainda sinto que é um pouco desajeitado, já que eu tenho que chamair explicitamente os setores do ajudante (normalmente, o que você quer se livrair da injeção).

    (Espero um pouco caso alguém venha com uma solução melhor)

    (Aplica-se a Dagger v1.0.1)

    Certifique-se de que está usando a injeção do adaptador. Com a injeção reflexiva, dagger apairentemente não faz nenhuma injeção transitiva em objects @Provides . Eu penso que isto é um erro.

    Em termos de injetair o context certo, você pode querer dair uma olhada neste exemplo https://github.com/squaire/dagger/tree/master/examples/android-activity-graphs .

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.