2015-02-27 15 views
7

numaralı anahtarla bağlanamadı. İlk kez hançer deniyorum ve modülü yapılandırdıktan sonra anlayamadığım bir hata alıyorum.Hançer: class

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!"; 
    } 
} 

Benim modül

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

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

Ve kodda ben o

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

derleyici ile şikayet bu şekilde kullanabilirsiniz:

Benim kodudur

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 

Neyi yanlış yapıyorum?

Not: Bu EnglishLanguage bir sistem sınıftır gerçek kodda sadece basitleştirilmiş bir örnektir ve sadece yerine sen yorumlamaya bir referansı

cevap

13

olsun, değiştiremez ne de yaratamaz Yanlış yapalım, doğru örneği verelim ve orada neler olduğunu açıklayalım.

Bu pasajı mükemmel olduğunu ve olduğu gibi kalır:

Parrot yapıcı @Inject açıklama ile
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!"; 
    } 
} 

, ne Parrot bir örneğini talep ettiklerinde Dagger," söylüyorsun, bu yapıcı kullanmak onu ".

Hançer, Parrot'un Language arabiriminin bir örneğine gereksinim duyduğunu görür ve onu almanın bir yolunu bulmaya çalışır. Ancak, Language bir arabirim olduğundan, Hançerin kullanılacak beton tipini bilmesi gerekir. Böyle, sizin ObjectGraph üzerinden Parrot bir örneğini almak mümkün olmalıdır, Şimdi

@Module 
public class PetshopModule { 

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

: Eğer EnglishLanguage sınıf düzenleyemezsiniz yana

, bunun için bir @Provider yöntem yazmak gerekir :

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

Bunu test etmedim, bu işe yarayacak. Eğer EnglishLanguage sınıfını değiştirme mümkün olsaydı


, aşağıdaki yapabilirdi. @Inject ile EnglishLanguage yapıcı ek açıklama ve Language sağlayıcı yönteminde bir EnglishLanguage örneğini talep:

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; 
    } 
} 

Bu durumda, Hançer Language sağlayıcı yöntemi arar ve döndürmek için bir EnglishLanguage somutlaştırır.

İlgili konular