2015-02-27 10 views
7

Ich versuche zum ersten Mal Dolch und, nach der Konfiguration des Moduls, bekomme ich einen Fehler, den ich nicht verstehe.Dolch: Klasse konnte nicht mit Schlüssel gebunden werden

Mein Code ist:

public class Parrot { 

    private Language language; 

    @Inject 
    public Parrot(Language language) { 
     this.language = language; 
    } 

    public void sayHello() { 
     System.out.println(language.getSalute()); 
    } 
} 

public interface Language { 
    public String getSalute(); 
} 

public class EnglishLanguage implements Language { 

    @Override 
    public String getSalute() { 
     return "Hello!"; 
    } 
} 

Mein Modul

@Module(
     injects = Language.class 
) 
public class PetShopModule { 

    @Provides Parrot provideParrot(Parrot parrot){ 
     return parrot; 
    } 
} 

Und in dem Code Ich benutze es auf diese Weise

EnglishLanguage lang=SystemApp.getSystemLanguage(); 
ObjectGraph objectGraph = ObjectGraph.create(new PetShopModule()); 
objectGraph.inject(myLanguage); 
Parrot parrot = objectGraph.get(Parrot.class); 

Der Compiler beschwert sich mit:

error: com.example.petshop.Language could not be bound 
with key com.example.petshop.Language required by com.example.petshop.PetShopModule 
for com.example.petshop.PetShopModule 

Was mache ich falsch?

Hinweis: Dies ist nur ein vereinfachtes Beispiel, in dem realen Code die English eine Systemklasse ist, und ich kann es nicht ändern, noch schaffen, nur um eine Referenz

Antwort

13

Statt zu kommentieren, was du bist falsch machen, lassen Sie uns das richtige Beispiel geben und erklären, was dort passiert.

Dieser Ausschnitt ist perfekt, und so bleibt, wie es ist:

public class Parrot { 

    private Language language; 

    @Inject 
    public Parrot(Language language) { 
     this.language = language; 
    } 

    public void sayHello() { 
     System.out.println(language.getSalute()); 
    } 
} 

public interface Language { 
    public String getSalute(); 
} 

public class EnglishLanguage implements Language { 

    @Override 
    public String getSalute() { 
     return "Hello!"; 
    } 
} 

Mit der @Inject Anmerkung auf dem Parrot Konstruktor, Sie sagen Dagger „Immer, wenn ich eine Instanz von Parrot fordern, verwenden Sie diesen Konstruktor instanziieren ".

Dolch sieht, dass Parrot eine Instanz der Language-Schnittstelle benötigt, und versucht, einen Weg zum Abrufen zu finden. Da Language jedoch eine Schnittstelle ist, muss Dagger wissen, welcher konkrete Typ zu verwenden ist.

Da Sie die EnglishLanguage Klasse nicht bearbeiten können, müssen Sie eine @Provider Methode für sie schreiben:

@Module 
public class PetshopModule { 

    @Provides 
    Language provideLanguage() { 
    return SystemApp.getSystemLanguage(); 
    } 
} 

Nun sollten Sie in der Lage, eine Instanz von Parrot aus Ihrem ObjectGraph, wie diese zu erhalten :

ObjectGraph graph = ObjectGraph.create(new PetshopModule()); 
Parrot parrot = graph.get(Parrot.class); 

Ich habe dies nicht getestet, bit sollte dies funktionieren.


Wenn Sie Lage waren, die EnglishLanguage Klasse zu ändern, können Sie folgendes tun. Anmerken den EnglishLanguage Konstruktor mit @Inject, und fordern Sie eine EnglishLanguage Instanz im Language Provider Methode:

public class EnglishLanguage implements Language { 

    @Inject 
    public EnglishLanguage() { 
    } 

    @Override 
    public String getSalute() { 
    return "Hello!"; 
    } 
} 

@Module 
public class PetshopModule { 

    @Provides 
    Language provideLanguage(EnglishLanguage language) { 
    return language; 
    } 
} 

In diesem Fall sieht Dolch für die Language Provider-Methode und instanziiert ein EnglishLanguage zurückzukehren.

Verwandte Themen