2016-03-23 13 views
3

Ich habe zwei Klassen von Drittanbietern, die beide eine Implementierung einer Authorizer Schnittstelle übernehmen. Ich muss jeder mit einer anderen Implementierung injizieren.Guice: injizieren unterschiedliche Implementierung je nachdem wer es bekommt?

Wenn ich eine @Provides mache, wie kann ich es implementieren, so dass es die zur Laufzeit erforderliche Implementierung bietet? Der Anbieter hat keine Ahnung, wer nach der Injektion fragt.

In der Theorie könnte ich @Named verwenden, aber ich kann den Code, der injiziert wird, nicht ändern. Ich möchte wie etwas tun:

bind(Authorizer.class).to(ImplA.class).for(SomeClass.class) 
bind(Authorizer.class).to(ImplB.class).for(SomeOtherClass.class) 

Offensichtlich ist die „für“ Code existiert nicht, aber gibt es einige gleichwertige Art und Weise, dies zu tun?

+0

Haben Sie bei http://stackoverflow.com/questions/8046805/guice-and-interface-that-has-multiple-implementations sah – Bajal

+0

'@ Named' und andere Bindungs ​​Anmerkungen sind so, wie Sie sind soll damit umgehen. –

+0

Leider erfordern beide Lösungen eine Annotation des Code, der injiziert wird, was ich, wie ich bereits erwähnte, nicht tun kann (sie stammen von Drittanbieter-Jars). –

Antwort

1

Sie erreichen dies mit Private Modules, die Sie (für beide Seiten nicht zugänglich) lassen installieren Bindungen in Konflikt bei der Konstruktion eine begrenzte Anzahl an nicht-Konflikt ausgesetzt Bindungen verwendet werden. Dies wird oft als Lösung für die robot legs problem gesehen, in dem Sie (zum Beispiel) wollen würde eine @Left Leg aussetzen und ein @Right Leg wo das Leg Objekt ist genau das gleiche, aber sie haben unterschiedliche Foot Implementierungen gebunden (LeftFoot und RightFoot) weiter in der Hierarchie.

An dieser Stelle geben Sie nicht an, wer es erhält, sondern Sie zeigen ein etwas anderes Injector-Diagramm für einen Verbraucher gegenüber dem anderen.

install(new PrivateModule() { 
    bind(Authorizer.class).to(ImplA.class); 
    expose(SomeClass.class); 
}); 
install(new PrivateModule() { 
    bind(Authorizer.class).to(ImplB.class); 
    expose(SomeOtherClass.class); 
}); 
Verwandte Themen