2017-02-28 3 views
0

Ich bin mit Dolches Abhängigkeit Bereichen kämpfen. Wenn ich eine Reihe von Scopes habe, muss ich viele Bereitstellungsmethoden manuell schreiben. Kann man einfach definieren, wie man von einem Typ zum anderen geht, ohne alle diese Qualifier immer wieder anzuhängen?Dolch 2: Pass Qualifizierer ohne Duplizierung Code

public static class A { 
    public A(String s) {} 
} 

public static class B { 
    public B(A a) {} 
} 

@Provides @QualifierOne public static String provideForQ1() { 
    return "one"; 
} 

@Provides @QualifierTwo public static String provideForQ2() { 
    return "two"; 
} 

@Provides @QualifierOne public static A provideAForQ1(@QualifierOne String s) { 
    return new A(s); 
} 

@Provides @QualifierTwo public static A provideAForQ2(@QualifierTwo String s) { 
    return new A(s); 
} 

@Provides @QualifierOne public static B provideBForQ1(@QualifierOne A a) { 
    return new B(a); 
} 

@Provides @QualifierTwo public static B provideBForQ2(@QualifierTwo A a) { 
    return new B(a); 
} 


@Qualifier @Retention(RUNTIME) @interface QualifierOne {} 

@Qualifier @Retention(RUNTIME) @interface QualifierTwo {} 

Antwort

0

Wenn Sie versuchen, ähnliche Objektdiagramme erstellen für @QualifierOne B und @QualifierTwo B ohne ihre Vorgänger ausgesetzt wird, würde ich einen @Subcomponent favorisieren schaffen, in dem Sie @BindsInstance verwenden, um die String Eingänge zu verändern und dann die B zurück. Auf diese Weise repräsentieren Ihre Unterkomponente und ihre Module das Objektdiagramm von String, A und B (und möglicherweise die AImpl und BImpl zu verwenden), die möglicherweise auch @Inject Konstruktoren auf A und B anstelle von manuellen Konstruktoraufrufen verwenden können.

Das sollte sich auch reiner als DI-Lösung anfühlen, denn dann kann A@ConfigKey String oder @EndpointServer String injizieren, nicht @UsefulForBuildGraphOne String. Sie beschreiben die Art der Abhängigkeit, die Sie benötigen, nicht das Build-Diagramm, in das sie eingefügt wird.

@Provides @QualifierOne public static B provideQ1B(
    MySubcomponent.Builder builder) { 
    return builder.withString("one").build().getB(); 
} 

@Provides @QualifierOne public static B provideQ2B(
    MySubcomponent.Builder builder) { 
    return builder.withString("two").build().getB(); 
} 

Wenn Sie uns noch mehr Details über das, was Ihre String, A und B darstellen und die von außen tatsächlich verbraucht werden, dann kann man erkennen, ermitteln, ob diese spezifische Lösung für Sie möglich oder günstig ist.

Weitere Informationen zu Unterkomponenten finden Sie in der Dagger 2 User's Guide.