मुझे लगता है कि NamshubWriter का प्रस्ताव बहुत मूर्ख नहीं है। मुझे लगता है कि गुइस में, एक निर्माता को बिल्कुल एक काम करना चाहिए: फ़ील्ड में पैरामीटर असाइन करें। अगर आपको कुछ और करने की ज़रूरत है, तो उसे कारखाने या प्रदाता में डाल दें।
इस मामले में, हम ए के लिए प्रदाता चाहते हैं। प्रदाता सीधे नए बी() को कॉल कर सकता है, लेकिन फिर हम सीधे ए से बी को जोड़ देंगे, जिसे हमने पहले स्थान से बचने की कोशिश की थी। इसलिए हम एक फैक्ट्री पर बी के निर्माण पर अप्रत्यक्ष हैं, जो कि guiceInjectedject के माध्यम से हमारे लिए गुजर प्रदान कर सकता है। यह कोड ठीक चलाता है और संकलित करता है, और पूरी तरह से ए और बी
एक यथार्थवादी परिदृश्य में, आपको पृथक्करण का लाभ उठाने के लिए इंटरफेस के पीछे ए और बी को छिपाने की आवश्यकता होगी।
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.FactoryProvider;
public class Try {
public static void main(String[] args) {
System.out.println(
Guice.createInjector(new MyModule()).getInstance(A.class)
);
}
}
class MyModule extends AbstractModule {
public void configure() {
bind(A.class).toProvider(AProvider.class);
bind(IBFactory.class).toProvider(
FactoryProvider.newFactory(IBFactory.class, B.class));
}
}
class A {
B b;
public void setB(B b) {
this.b = b;
}
}
class B {
A a;
@Inject
B(@Assisted A a) {
this.a = a;
}
}
class AProvider implements Provider<A> {
private final IBFactory bFactory;
@Inject
AProvider(IBFactory bFactory) {
this.bFactory = bFactory;
}
public A get() {
A a = new A();
a.setB(bFactory.create(a));
return a;
}
}
interface IBFactory {
public B create(A a);
}
I made an extended version of the circular dependency injection in Guice where A and B are hidden behind interfaces.
आप बस ए मैं अपने वास्तविक वर्ग अनुमान लगा रहा हूँ के लिए निर्माता को @Inject जोड़ सकते हैं थोड़ा और अधिक जटिल है। क्या बी इंटरफ़ेस है? क्या ए के अलावा कुछ के साथ इंजेक्शन की आवश्यकता है? बीटीडब्लू, "इस" क्षेत्र को कन्स्ट्रक्टर से बचने देना आम तौर पर एक बुरा विचार है। – NamshubWriter
नहीं, बी एक इंटरफेस नहीं बल्कि एक वर्ग है। बेशक, सर्कल निर्भरताएं अच्छी नहीं हैं और मैं इन दो वर्गों को दोबारा कर सकता हूं, लेकिन मुझे वास्तव में जो चाहिए वह गुइस व्यवहार्यता को समझना है। –