2008-09-17 16 views
9

मेरे पास एक ऑब्जेक्ट है जो विंडसॉर कंटेनर के साथ पंजीकृत IDISposable लागू करता है और मैं इसका निपटान करना चाहता हूं, इसलिए इसका निपटान विधि कहा जाता है और अगली बार संकल्प कहा जाता है कि यह एक नया उदाहरण प्राप्त करता है।विंडसर कंटेनर: ऑब्जेक्ट का निपटान कैसे करें?

container.Release(obj); 

स्वचालित रूप से फोन निपटान करता है() तुरंत? या मैं

obj.Dispose(); 
container.Release(obj); 

पर दस्तावेज में कुछ भी नहीं मिला करने की आवश्यकता है वास्तव में रिलीज क्या करता है

संपादित करें: परीक्षण मैं भागा के परिणामों के लिए नीचे मेरा उत्तर देखें। अब प्रश्न बन गया है, मैं कंटेनर को सिंगलटन जीवन चक्र के साथ एक घटक का उदाहरण जारी करने के लिए कैसे मजबूर करूं? इसे केवल एक ही स्थान पर किया जाना चाहिए और एक कस्टम जीवन चक्र लिखना बहुत भारी वजन लगता है, क्या ऐसा करने के तरीके में कोई निर्मित नहीं है?

उत्तर

10

यह कुछ मुझे लगता है कि लोगों को जब विंडसर कंटेनर के साथ काम करने का वास्तव में जानकारी नहीं है है निपटाए जब तक आप उन्हें अपने आप को रिलीज - हालांकि यह प्रलेखित है - एक नज़र here ले - लेकिन करने के लिए जल्दी से बोली:

microkernel एक प्लगेबल रिहाई नीति है कि ऊपर हुक और घटकों निपटान के लिए कुछ मार्ग को लागू कर सकते हैं।

  • AllComponentsReleasePolicy: microkernel तीन IReleasePolicy कार्यान्वयन के साथ आता है सभी घटकों को ट्रैक microkernel उदाहरण निपटान
  • LifecycledComponentsReleasePolicy पर सही निपटान लागू करने के लिए: प्रदर्शन नहीं करता: केवल घटकों जुड़े
  • NoTrackingReleasePolicy एक decommission जीवन चक्र है कि ट्रैक कोई ट्रैकिंग

आप इंटरफ़ेस IReleasePolicy का उपयोग कर अपनी खुद की रिलीज नीति भी कार्यान्वित कर सकते हैं।

आपको पता चल सकता क्या आसान एक NoTrackingReleasePolicy लिए नीति में परिवर्तन करने और फिर संभाल है अपने आप को निपटाने - इस संभावित जोखिम भरा भी है, लेकिन अगर आपके जीवन शैली काफी हद तक क्षणिक होते हैं (या जब अपने कंटेनर निपटान किया जाता है, तो आपका आवेदन वैसे भी बंद होने वाला है) शायद यह एक बड़ा सौदा नहीं है। याद रखें कि किसी भी घटक जो पहले से ही सिंगलटन से इंजेक्शन कर चुके हैं, एक संदर्भ रखेगा, ताकि आप अपने सिंगलेट्स को "ताज़ा करने" की कोशिश करने में समस्याएं उत्पन्न कर सकें - यह एक बुरी आदत की तरह लगता है, और मुझे आश्चर्य है कि शायद आप इससे बचने से बच सकते हैं अपने अनुप्रयोगों को एक साथ रखने के तरीके को बेहतर बनाकर इसे पहले स्थान पर करें।

अन्य दृष्टिकोण अपने स्वयं के डिमोकेशन कार्यान्वयन के साथ एक कस्टम जीवन चक्र बनाने के लिए हैं (इसलिए सिंगलटन को वास्तव में घटक का निपटान करना होगा, जो क्षणिक जीवन चक्र की तरह होता है)।

वैकल्पिक रूप से एक और तरीका है कि आपकी सेवा के लिए एक सिंगलटन जीवनशैली के साथ कंटेनर में पंजीकृत एक सजावटी है, लेकिन आपकी वास्तविक अंतर्निहित सेवा एक क्षणिक जीवन शैली के साथ कंटेनर में पंजीकृत है - तब जब आपको घटक को रीफ्रेश करने की आवश्यकता होती है तो बस सजावटी द्वारा आयोजित क्षणिक अंतर्निहित घटक और इसे एक ताजा हल किए गए उदाहरण के साथ प्रतिस्थापित करें (सजावटी प्राप्त करने से बचने के लिए, घटक की कुंजी का उपयोग करके इसे हल करें) - यह अन्य सिंगलटन सेवाओं के साथ मुद्दों से बचाता है (जिन्हें "ताज़ा नहीं किया जा रहा है ") उन्हें पुरानी सेवाओं पर रखने से रोक दिया गया है, जिन्हें उन्हें अनुपयोगी बनाने का निपटाया गया है, लेकिन इसे काम करने के लिए थोड़ा कास्टिंग आदि की आवश्यकता होती है।

+0

मुझे एक ही समस्या है, मैं सजावटी अवधारणा की तरह बहुत अधिक पसंद करता हूं। अच्छा है ... –

+0

@ बिटरकोडर अगर मैं कंटेनर का निपटारा कर रहा हूं तो क्या इसे सिंगलटन ऑब्जेक्ट्स के लिए इसे कैसे मजबूर करना होगा? –

3

यह आपके द्वारा निर्दिष्ट घटक की जीवनशैली पर निर्भर करता है जब आपने इसे कंटेनर में जोड़ा था।

यदि आप जीवनशैली को पूल किया जाता है तो आप रिलीज() का उपयोग करेंगे। यह घटक को अगले पुनर्प्राप्ति के लिए पूल में वापस रखता है (वस्तु नष्ट नहीं होती है, इसलिए निपटान खराब होगा)

यदि जीवनशैली क्षणिक है, तो घटक प्राप्त होने पर एक नई वस्तु बनाई जाती है। इस मामले में निपटान आपके ऊपर है, और आपको रिलीज

यदि जीवनशैली थ्रेड है, तो प्रत्येक घटक के लिए उसी घटक का उपयोग किया जाता है, नष्ट नहीं किया जाता है।

यदि जीवनशैली सिंगलटन है, तो केवल एक घटक बनाया जाता है और नष्ट नहीं होता है।

सबसे अधिक संभावना है, आप क्षणिक घटकों का उपयोग कर रहे हैं? उस मामले में (यदि आप एक समय पर ढंग उनमें से निपटाने के बारे में चिंतित हैं), बस इसे एक का उपयोग कर के साथ रैप और आप तैयार हैं (या अपने आप को कहीं निपटाने फोन)

using(ISomeService service = container.Resolve<ISomeService>()) 
{ 
// Do stuff here 
// service.Dispose is automatically called 
} 

संपादित - हाँ , अपने सिंगलटन को "ताज़ा करने" या निपटाने और फिर से बनाने के लिए आपको कंटेनर को नष्ट करने या कस्टम जीवन चक्र लिखने की आवश्यकता होगी। एक कस्टम जीवन चक्र करना वास्तव में मुश्किल नहीं है और तर्क को एक ही स्थान पर ऐसा करने के लिए रखता है।

+0

वास्तव में मैं सिंगलेट कर रहा हूं लेकिन कभी-कभी घटक को पुन: उत्पन्न करने के लिए मजबूर करना चाहता हूं। –

1

ठीक है, तो मैं बराबर चल रही है परीक्षण और यह Container.Release() की तरह लगता है परोक्ष यदि जीवन शैली क्षणिक है केवल निष्पादित करने के लिए एक IDisposable के Dispose() विधि का कारण होगा (यह शायद बिल्कुल सही नहीं है, लेकिन बात यह अभ्यस्त 'है कि एक रफ़ू करना है चीज अगर लाइफस्टाइल सिंगलटन है)।

अब अगर आप फोन Container.Dispose() यह भी डिस्पोजेबल तरीकों कॉल करेंगे, हालांकि दुर्भाग्य से यह पूरे गिरी के निपटान होगा और आप सभी घटकों में शामिल करने की आवश्यकता होगी: सौभाग्य से मेरे मामले मैं यह कर सकते हैं में

var container = new WindsorContainer(); 
container.AddComponentWithLifestyle<MyDisposable>(Castle.Core.LifestyleType.Singleton); 
var obj = container.Resolve<MyDisposable>(); // Create a new instance of MyDisposable 
obj.DoSomething(); 
var obj2 = container.Resolve<MyDisposable>(); // Returns the same instance as obj 
obj2.DoSomething(); 
container.Dispose(); // Will call the Disposable method of obj 
// Now the components need to be added back in 
container.AddComponentWithLifestyle<MyDisposable>(Castle.Core.LifestyleType.Singleton); 
var obj3 = container.Resolve<MyDisposable>(); // Create a new instance of MyDisposable 

बस सभी घटकों को छोड़ने का जोखिम है और मैं उन्हें काफी आसानी से बहाल कर सकता हूं। हालांकि यह उप-इष्टतम है।विशेष रूप से अक्सर आश्चर्य की बात व्यवहार है कि डिस्पोजेबल क्षणिक घटकों गिरी के जीवन भर के लिए कंटेनर द्वारा पर आयोजित की जाती हैं यह है जब तक -