Guice के बारे में एक सवाल reinjection। मैं अभी भी इसे सीख रहा हूं, लेकिन मैं मूलभूत सिद्धांतों को समझ सकता हूं।Guice क्रम निर्भरता मापदंडों
यह सवाल पहले से ही नेट पर एक दो बार पूछा गया था, लेकिन कभी नहीं एक ठोस जवाब (कोई नहीं है कि मैं मिल सकता है) के साथ।
मैं चित्र पर की तरह एक स्थिति है (एक समान उदाहरण नेट पर somewere था) कहो।
public class Dog {}
public class Walk implements Walkable {
private final Dog dog;
private final boolean leash;
@Inject
public Walk(Dog dog, @Assisted boolean leash) {
this.dog = dog;
this.leash = leash;
}
public void go() {
}
}
public interface Walkable {
void go();
}
public interface WalkFactory {
Walk create(boolean leash);
}
public class AssistedMain {
public static void main(String[] args) {
Injector i = Guice.createInjector(new AbstractModule() {
protected void configure() {
install(new FactoryModuleBuilder().
implement(Walkable.class, Walk.class).
build(WalkFactory.class));
}
});
Walk walk = i.getInstance(WalkFactory.class).create(true);
}
}
बस इतना ही बढ़िया है। लेकिन सवाल यह है कि - क्या मैं, किसी भी तरह, इस निर्भरता पर भरोसा रखने वाले वर्गों पर उपयोग किए जाने वाले "कंटेनर" (इंजेक्टर) को उस ऑब्जेक्ट उदाहरण को पुन: पेश कर सकता हूं।
तो, एक interface Person
, class PersonImpl
जोड़ सकते हैं।
नए वर्गों स्रोत हैं:
public interface Person {
void walkDog();
}
public class PersonImpl implements Person {
private Walkable walkable;
@Inject
public PersonImpl(Walkable walkable) {
this.walkable = walkable;
}
public void setWalkable(Walkable walkable) {
this.walkable = walkable;
}
public void walkDog() {
walkable.go();
}
}
तो, सवाल है - मैं कर रहा हूँ, किसी भी तरह वास्तव में जोड़ा वस्तु में इस विशेष उदाहरण इंजेक्षन करने में सक्षम। यह एक साधारण उदाहरण है, लेकिन हम मान सकते हैं कि इस के नीचे कक्षाओं के 10 स्तर हैं।
समाधान मैंने पाया बहुत लचीला नहीं है। कुछ की तरह:
Injector i = Guice.createInjector(new SimpleModule(false, dog));
और फिर ठोस उदाहरण के लिए बाध्य। यह बहुत गतिशील नहीं है। असल में, हर बार मुझे एक अलग रनटाइम/गतिशील पैरामीटर की आवश्यकता होती है, मुझे इंजेक्टर को फिर से बनाना होगा।
Provider<T>
अच्छा है, FactoryModuleBuilder
मदद करता है, लेकिन मैं वस्तुओं को वापस कैसे इंजेक्ट कर सकता हूं?
इस समस्या का समाधान और अधिक गतिशील हैं?
धन्यवाद।
मुझे समझ में आता है। – mpierce