2008-10-07 24 views
10

जब कक्षा को इंस्टेंट करना, डिफ़ॉल्ट रूप से विंडसर कक्षा के सभी सार्वजनिक गुणों को वैकल्पिक निर्भरताओं के रूप में मानता है और उन्हें संतुष्ट करने का प्रयास करता है। मेरे मामले में, यह एक जटिल परिपत्र निर्भरता बनाता है जो मेरे आवेदन को लटकने का कारण बनता है।विंडसर कंटेनर: सार्वजनिक संपत्ति को कैसे निर्दिष्ट किया जाना चाहिए कंटेनर द्वारा भरा नहीं जाना चाहिए?

मैं स्पष्ट रूप से कैसल विंडसर को कैसे बता सकता हूं कि इसे सार्वजनिक संपत्ति को पूरा करने की कोशिश नहीं करनी चाहिए? मुझे लगता है कि उस हद तक एक विशेषता होनी चाहिए। हालांकि मुझे यह नहीं मिल रहा है इसलिए कृपया मुझे उपयुक्त नामस्थान/असेंबली बताएं।

यदि गुणों के बिना ऐसा करने का कोई तरीका है (जैसे एक्सएमएल कॉन्फ़िगरेशन या कोड के माध्यम से कॉन्फ़िगरेशन) जो विशिष्ट लाइब्रेरी के बाद बेहतर होगा, जहां यह हो रहा है, उस तारीख को महल पर निर्भरता की आवश्यकता नहीं है।

+0

इस प्रश्न को विंडसर FAQ में जोड़ा गया: http://using.castleproject.org/display/IoC/FAQ –

उत्तर

3

मैं इस के साथ मदद करने के लिए एक सुविधा बनाया:

+0

यह लिंक मर चुका है। कोई सुधार? –

+0

@GorgiRankovski मुझे यकीन नहीं है कि यह पैकेज Castle.Windsor के आधुनिक संस्करणों के लिए प्रासंगिक है (मैं आजकल स्ट्रक्चरमैप या ऑटोफाक का उपयोग करता हूं इसलिए मुझे नहीं पता)। आप स्रोत कोड प्राप्त कर सकते हैं [Google कोड पर इस पुराने svn से] (https://code.google.com/p/gim-projects/source/browse/#svn%2Ftrunk) –

11

आप आईओसी कंटेनर द्वारा तार किया जा रहा से एक संपत्ति को रोकने के लिए Castle.Core.DoNotWireAttribute विशेषता का उपयोग कर सकते हैं (इस में है कैसल। अधिक असेंबली, जिसका अर्थ है कि आपकी लाइब्रेरी को केवल हल्के कैसल पर निर्भरता लेनी होगी। अधिक असेंबली - यदि उदाहरण के लिए आप सी का उपयोग करना चाहते हैं नियंत्रण कंटेनर की पूरी तरह से उलटा बिना, या एक अलग आईओसी कंटेनर में ode)।

मैं वहाँ Xml विन्यास में ऐसा होने से तारों को रोकने के लिए किसी भी तरह से है पर विश्वास नहीं है, लेकिन यह इस बात के लिए समर्थन जोड़ने के लिए यथोचित आसान होगा - अगर मैं यह करने के लिए मैं शायद होता था:

  1. PropertiesDependenciesModelInspector से, InspectProperties अधिभावी तरीका है जिसके गुण की पहचान करने के लिए कुछ अतिरिक्त तर्क लागू करने के लिए < myprop तार = "false"/>
  2. इनहेरिट: विशेषता किसी तरह का संपत्ति घोषणा पर एक्सएमएल में परिचय घटकों के मॉडल पर निर्भरता के रूप में जोड़ा जाना चाहिए (मॉडल का निरीक्षण करना। तार = "झूठी" विशेषता/मूल्य जोड़ी के लिए कॉन्फ़िगरेशन)।
  3. DefaultComponentModelBuilder से विरासत और अपने प्रतिस्थापन PropertiesDependenciesModelInspector शामिल करने के लिए InitializeContributors ओवरराइड - या सिर्फ मौजूदा गुण योगदानकर्ता को निकालना और AddContributor/RemoveContributor विधियों के माध्यम से रन टाइम पर अपनी खुद की जोड़ें।
  4. घटक मॉडेलबिल्डर सेवा घटक को अपने कंटेनर के कर्नेल को सौंपा गया बदलें।

एक और दृष्टिकोण जो आपके लिए काम कर सकता है, सेवा के किसी भी उदाहरण से अनुरोध किए जाने से पहले मॉडल से निर्भरता को मैन्युअल रूप से हटा देना है।

कर्नेल। गेटहैंडलर (टाइपोफ (MyComponent))। घटक मॉडेल। निर्भरता। RemoveAll (डी => डी।निर्भरताकी == "संपत्ति थॉटशॉटनोट बीवायर");

यमएमवी उस दृष्टिकोण के साथ हालांकि - विशेष रूप से यदि आपके पास प्रारंभिक सेवाएं या अन्य सुविधाएं हैं जो पंजीकृत होने के बाद आपके घटक को उत्सुकता से तत्काल कर सकती हैं।

+0

वह कोड नमूना 2.5.x में काम नहीं करता है - 'RemoveAll()' विधि समाप्त हो गई है। क्या कोई विकल्प है? –

+0

पीएस मैं धाराप्रवाह पंजीकरण API का उपयोग कर रहा हूँ। –

2

मैं नहीं जानता कि कैसल आप का कौन सा संस्करण लोग उस समय उपयोग कर रहे थे, लेकिन उल्लिखित समाधान में से कोई भी काम नहीं कर रहा था। इसके अलावा, बहुत सारे मृत लिंक हैं।

महल 3.1 के साथ

, यहाँ समाधान मैं (खुदाई कुछ महल स्रोत कोड के लिए धन्यवाद) के साथ आया था:

container.Register(Component.For(type) 
             .LifestyleTransient() 
             .Properties(propertyInfo => propertyInfo.PropertyType != typeof(MyOtherType))); 

'गुण' समारोह जब ComponentModel निर्माण महल द्वारा इस्तेमाल किया एक संपत्ति फिल्टर कहते हैं। मेरे मामले में, संपत्ति के प्रकार 'MyOtherType' को छोड़कर सभी गुण निर्भरता संतुष्ट होगी।

संबंधित मुद्दे