2017-11-21 3 views
0

das folgende Szenario Betrachtet:Wie mache ich zwei verschiedene @Provider injizieren die gleiche @Singleton in Dolch 2?

public class SessionManager implements HasSession, HasCredentials{ 
/**implementation here*/ 
} 

Ich habe eine Sessionmodule definiert Sessionmanager zu injizieren, wenn HasSession oder HasCredentials zur Injektion angefordert wird:

@Module 
public abstract class SessionModule { 
    @Provides @Singleton static HasSession hasSession(SessionManager sessionManager){ 
     return sessionManager; 
    }; 

    @Provides @Singleton static HasCredentials hasCredentials(SessionManager sessionManager){ 
     return sessionManager; 
    }; 
} 

Dann habe ich die entsprechende Komponente definiert:

@Component(modules={SessionModule.class}) 
@Singleton 
public interface MyComponent { 

    public HasSession getSessionProvider(); 

    public HasCredentials getCredentialsProvider(); 

} 

getSessionProvider und getCredentialsProvider werden zwei verschiedene SessionManager Instan erstellen/zurückgeben ce.

Ich möchte eine einzige Instanz von SessionManager erstellt werden und zurückgegeben werden, wenn ich getSessionProvider oder getCredentialsProvider aufrufen. Wie kann ich das mit Dagger 2 schaffen?

Antwort

0

fand ich die Lösung für dieses Problem: Nur ein Singleton-Anbieter für Sessionmanager definieren:

@Provides @Singleton 
static SessionManager sessionManager(/*dependencies here*/){ 
    return new SessionManager(/**dependencies*/); 
} 
1

Sie müssen zwei verschiedene Dinge tun:

  1. Scope die Bindung, so dass es nur eine Instanz ist.
  2. Alias ​​die Bereichsbindung an die alternativen Typen.

Zuerst Umfang der Bindung:

@Qualifier 
private @interface Scoped {} 

@Provides @Singleton 
@Scoped SessionManager scopeSessionManager(SessionManager manager) { 
    return manager; 
} 

Zweitens alias die scoped Bindung:

@Binds abstract HasSession bindHasSession(@Scoped SessionManager manager); 
@Binds abstract HasCredentials bindHasCredentials(@Scoped SessionManager manager); 

Hinweis: Dies wird nicht Module in dieser Komponente verhindern, dass mit der unscoped SessionManager , also sei vorsichtig.

Eine einfache Möglichkeit, dies zu umgehen ist ein @Component.Builder und @BindsInstance in einer einzigen Instanz von SessionManager passieren verwenden zu verwenden, die effektiv scoped (und damit ist über die Notwendigkeit für die ersten Code-Schnipsel zu beseitigen und damit Ihren Original-Code zu arbeiten).

+0

Danke für Ihren Kommentar Jake. Ich habe es versucht und funktioniert, aber ich möchte Quilifier vermeiden, wenn sie nicht gebraucht werden. Wenn ich zwei verschiedene Implementierungen der gleichen Schnittstelle hätte, würde ich mich dafür entscheiden. Ich fand eine Lösung, die ziemlich trivial ist. – Dondump

Verwandte Themen