2015-10-20 1 views
1

J'essaie de créer une bibliothèque Android parallèlement à un autre projet tout en apprenant DI avec Dagger 2. Cela s'avère plus difficile que prévu.Injection de dépendances avec Dagger 2

Ma question

Je suis en train d'utiliser une classe singleton appelé MySingleton que je veux accéder à la fois ma bibliothèque Android ainsi que l'application principale.

Configuration actuelle

Fondamentalement, j'ai une classe singleton appelé MySingleton dans mon projet de bibliothèque Android. Dans le projet, j'ai une classe appelée SingletonModule qui est un module Dagger2 qui fournit mon singleton comme ça.

@Provides @Singleton 
MySingleton providesMySingleton() { 
    return new MySingleton(); 
} 

Ok, maintenant dans mon application actuelle dans j'ai le composant suivant.

@Singleton 
@Component(modules = {SingletonModule.class}) 
public interface ApplicationComponent { 
    void inject(MyApplication application); 
} 

Donc ceci est utilisé pour injecter MySingleton dans la classe MyApplication. Ca le fait comme ça.

this.applicationComponent = DaggerApplicationComponent.builder() 
      .singletonModule(new SingletonModule()) // does it for you as empty constructor 
      .build(); 
    applicationComponent.inject(this); 

Ce grand et est l'instance de MySingleton que je l'injection par domaine fonctionne bien.

Ce que j'ai essayé

Dans mon projet de bibliothèque Android J'ai créé un nouveau composant appelé SingletonComponent qui a fait la même chose que ApplicationComponent, vient de donner l'objet MySingleton. Puis dans la classe MyService qui s'étend Service j'ai injecté, par champ, l'objet MySingleton. Cela n'a pas eu l'effet que j'avais après. Il a objecté un objet MySingleton mais ce n'était pas la même instance que celle créée lors de l'injection dans mon application actuelle. Je crois que c'est parce que c'est un nouveau composant que je crée ...

Qu'est-ce que je fais mal ici?

J'ai regardé de nombreux sites différents et suivi de nombreux tutoriels, mais quelque chose ne clique pas avec cette injection de dépendance.

Répondre

1

Je crois que c'est parce qu'il est un nouveau composant que je crée ...

Vous êtes tout à fait correct. Les singletons sont uniques par graphe de dépendance. Lors de la création du second composant, vous créez essentiellement un second graphique de dépendance qui a un objet différent pour ce singleton.

Il y a deux solutions:

  1. Créer un seul graphique dans votre application qui inclut les modules lib
  2. Créez un graphique en vous lib, puis ajoutez votre module d'application (s) à elle (comme dans: https://github.com/google/dagger/tree/master/examples/android-activity-graphs (ils ajoutent le module "par activité" là mais vous obtiendrez l'idée))
+0

Je dois pouvoir injecter des modules dans des classes dans ma bibliothèque. Que faire si j'ai un composant créé dans ma bibliothèque (peut-être une sorte de singleton) que je passe ensuite dans mon composant Application qui utilise ensuite cette instance? – StuStirling

+0

Dans la mesure où je vous comprends, vous aurez besoin de quelque chose comme: '@Component (dépendances = LibraryComponent.class, modules = MyAppModule.class)' pour votre composant d'application. De cette façon, votre composant d'application inclura le composant lib et pourra utiliser ses objets (ce qui est essentiellement la signification de l'option 2). – Ognyan

+0

Je vais lier votre propre question que je viens de trouver qui m'a aidé à le résoudre. http://stackoverflow.com/questions/31354735/how-to-migrate-missing-inject-from-module-with-complete-false-from-dagger-1-to C'est exactement ce dont j'avais besoin. – StuStirling