मेरे पास एक ऐप है जिसमें IView (प्रोजेक्ट ए) से प्राप्त विचार शामिल हैं

मेरे पास एक अन्य प्रोजेक्ट (प्रोजेक्ट बी) में सिंगलटन के रूप में विंडसर आईओसी कंटेनर है

प्रोजेक्ट ए में प्रोजेक्ट बी का संदर्भ है, और विशेष विचारों के लिए ठोस प्रकार को हल करने के लिए कंटेनर को एक स्थिर कॉल करता है

अगर मैं अपने कंटेनर को कॉन्फ़िगर करने के लिए एक्सएमएल कॉन्फ़िगरेशन का उपयोग करता हूं तो सब ठीक है और अच्छा है।

यदि मैं अपने कंट्रेनर को कॉन्फ़िगर करने के लिए धाराप्रवाह इंटरफ़ेस का उपयोग करने का प्रयास करता हूं तो मुझे एक परिपत्र संदर्भ मिलता है, क्योंकि अब मुझे इंटरफेस और ठोस प्रकार निर्दिष्ट करने के लिए प्रोजेक्ट ए को संदर्भित करने के लिए प्रोजेक्ट बी की आवश्यकता है।

तो धाराप्रवाह इंटरफ़ेस का उपयोग करके इस बारे में जाने का सबसे अच्छा तरीका क्या है?

संपादित करें:

प्रोजेक्ट ए में ऐप स्टार्टअप पर यह है:

IoC.Instance.Start(); // this configures the container from config
IoC.Instance.Container.Resolve<IBootStrapper>().Start();

जहां IoC प्रोजेक्ट B . में परिभाषित एक स्थिर वर्ग है

1
ChrisCa 13 अप्रैल 2011, 19:04

1 उत्तर

सबसे बढ़िया उत्तर

सबसे अच्छा है कि आप अपने एप्लिकेशन को डिपेंडेंसी इंजेक्शन (कंस्ट्रक्टर इंजेक्शन) के आसपास डिजाइन करें और कंटेनर को अपने एप्लिकेशन के स्टार्टअप पाथ (कंपोजीशन रूट) पर कॉन्फ़िगर करें। आदर्श रूप से, आपके प्रोजेक्ट B को DI कंटेनर पर ही निर्भरता नहीं होनी चाहिए, या प्रोजेक्ट में कुछ बूटस्ट्रैपिंग कोड होना चाहिए जो उस प्रोजेक्ट के लिए कॉन्फ़िगरेशन बनाने की अनुमति देता है।

जब आप कंटेनर को स्टार्टअप प्रोजेक्ट (संभवतः आपके मामले में प्रोजेक्ट ए) में पंजीकृत करते हैं तो आपके पास एक परिपत्र संदर्भ नहीं होगा।

अपडेट करें

टिप्पणियों में आपने बताया कि आपका प्रोजेक्ट बी प्रोजेक्ट पूरी तरह से आईओसी बूटस्ट्रैपिंग के लिए है। बूटस्ट्रैपर प्रोजेक्ट होने में कुछ भी गलत नहीं है, क्योंकि यह आपको अन्य सभी प्रोजेक्ट्स को किसी भी आईओसी कंटेनर के उपयोग से पूरी तरह से साफ करने की अनुमति देगा। आप आमतौर पर एक बूटस्ट्रैपर प्रोजेक्ट का उपयोग करेंगे यदि आपके पास कई पुस्तकालय हैं जिनका कई अनुप्रयोगों द्वारा पुन: उपयोग किया जाता है (उदाहरण के लिए एक व्यावसायिक परत जो एक वेब ऐप, एक वेब सेवा और एक विंडोज़ सेवा द्वारा उपयोग की जाती है)।

हालाँकि, बूटस्ट्रैपर प्रोजेक्ट को पुन: प्रयोज्य परियोजनाओं की केवल 'स्थिर' निर्भरता बूटस्ट्रैप करना चाहिए। प्रति एप्लिकेशन प्रोजेक्ट में परिवर्तन करने वाली चीज़ों को कॉन्फ़िगर करने का कोई मतलब नहीं है। इसके बाद, चूंकि बूटस्ट्रैपर अपने आप में एक पुन: प्रयोज्य परियोजना है, आप नहीं चाहते कि यह आपके किसी एप्लिकेशन प्रोजेक्ट पर निर्भर हो, क्योंकि यह वह हिस्सा होगा जिसे आप स्वैप कर रहे होंगे। Windows सेवा चलाते समय ASP.NET वेब ऐप का संदर्भ रखने का क्या उपयोग है? यह yucky होगा।

एक बूटस्ट्रैपर प्रोजेक्ट विशेष रूप से तब उपयोगी होता है जब कई एप्लिकेशन प्रोजेक्ट होते हैं, लेकिन इसका मतलब यह नहीं है कि आप इसे एकल एप्लिकेशन समाधान में उपयोग नहीं कर सकते हैं। फिर भी वही नियम यहां लागू होते हैं, क्योंकि आप परिपत्र संदर्भों के साथ समाप्त हो जाएंगे, जैसा कि आपने पहले ही देखा है।

दूसरे शब्दों में, समाधान सरल है: बूटस्ट्रैपर को नीचे दी गई परियोजनाओं के लिए केवल बूटस्ट्रैप निर्भरता दें, न कि एप्लिकेशन प्रोजेक्ट। हालांकि, यदि आपके पास केवल एप्लिकेशन प्रोजेक्ट है, तो आपको बूटस्ट्रैपर प्रोजेक्ट की आवश्यकता नहीं है; यह काम नहीं करेगा।

3
Steven 13 अप्रैल 2011, 23:39
2
+1 हालांकि मैं उस 'आदर्श' को हटा दूंगा। प्रोजेक्ट बी में कंटेनर का संदर्भ नहीं होना चाहिए।
 – 
Mark Seemann
13 अप्रैल 2011, 19:27
क्या आपका मतलब प्रोजेक्ट बी है? मैंने जो कहा है उसमें मेरा विंडसर कंटेनर है। यहीं पर मैं कंटेनर बनाता और कॉन्फ़िगर करता हूं...भ्रमित
 – 
ChrisCa
13 अप्रैल 2011, 19:37
तो क्या आप सिर्फ प्रोजेक्ट बी को हटाने और एक ही प्रोजेक्ट में सब कुछ रखने का सुझाव दे रहे हैं?
 – 
ChrisCa
13 अप्रैल 2011, 19:55
1
@Roonooir: प्रोजेक्ट B से IoC वर्ग को हटा दें, क्योंकि आपको सीधे प्रोजेक्ट B से IoC.Instance.Container.Resolve को कॉल नहीं करना चाहिए। अधिक जानकारी के लिए यहां देखें: bit.ly/a7lU76
 – 
Steven
13 अप्रैल 2011, 19:55
@ रूनूइर: "क्या आप सिर्फ प्रोजेक्ट बी को हटाने का सुझाव दे रहे हैं"। बिलकुल नहीं। अपने अनुप्रयोगों को परतों में अलग करना मेरी पुस्तक में अभी भी अच्छा अभ्यास है। नहीं: सुनिश्चित करें कि प्रोजेक्ट B न तो सीधे IoC वर्ग और न ही एकता का उपयोग करता है।
 – 
Steven
13 अप्रैल 2011, 19:57