2015-09-23 27 views
17

Próbuję wstrzyknąć aplikację Context w 2 inne obiekty, AuthManager i ApiClient.Sztylet 2 - Dlaczego jest to cykl zależności?

Oba zależą od tego kontekstu, a ApiClient zależy od AuthManager. Dlaczego jest to cykl zależności, jeśli Context nie ma odniesienia do pozostałych 2? czy można to rozwiązać?

EDIT: Oto niektóre kodu

@Module 
public class AppModule { 

    private final Application application; 

    public AppModule(Application application) { 
     this.application = application; 
    } 

    @Provides @Singleton 
    Context provideApplicationContext() { 
     return this.application; 
    } 
} 


@Module 
public class NetworkModule { 

    @Provides @Singleton 
    public AuthManager providesAuthManager(AuthManager manager) { 
     return manager; 
    } 

    @Provides @Singleton 
    public ApiClient providesApiClient(ApiClientFactory factory) { 
     return factory.create(); 
    } 
} 

@Singleton 
@Component(modules = {AppModule.class, NetworkModule.class}) 
public interface ApplicationComponent { 
    void inject(BaseActivity activity); 

    // Exported for child-components 
    Context context(); 
    ApiClient apiClient(); 
    AuthManager authManager(); 
} 

Odpowiedz

42
@Provides @Singleton 
public AuthManager providesAuthManager(AuthManager manager) { 
    return manager; 
} 

Twój providesAuthManager metoda, która dostarcza AuthManager zależy od AuthManager.

Jest cykl :)

+0

Pomaga dodać wszelkie komunikaty o błędach, które można uzyskać na pytanie. W tym przypadku zinterpretowałeś komunikat o błędzie w niewłaściwy sposób, co utrudnia nam pomoc :) – nhaarman

+0

Rozumiem. Wygląda na to, że źle zrozumiałem przykład ekspresu do kawy, ponieważ pokazałem "AuthManager" jako lokalny parametr, a sztylet automatycznie do niego wstrzyknął. Wydaje się, że właściwą metodą jest ustawienie "Kontekstu" jako lokalnego parametru. Dzięki :) –

+0

Ta odpowiedź skłoniła mnie do podwójnego sprawdzenia metody dostarczania i zaoszczędziło mi wiele godzin na szukaniu czegoś spowodowanego przez zwykłą literówkę. Dzięki! – user3265561

0

Usuń metodę providesAuthManager i dodać @Inject w authManager konstruktora.

+0

To prowadzi do innego błędu: "... nie można podać bez @Provide adnotowanej metody" – nhoxbypass