2009-10-10 9 views
5

मैं सिर्फ नियंत्रण (आईओसी) में उलझन में पढ़ रहा था और इससे मुझे परेशान था कि ऐसा लगता है जैसे यह स्मृति प्रबंधन को दर्द देता है। बेशक ऐसा लगता है कि आईओसी ज्यादातर कचरा एकत्रित वातावरण (नेट, जावा, स्क्रिप्टिंग) में प्रयोग किया जाता है, जबकि मेरी चिंता गैर-जीसी सेटिंग्स में होती है।नियंत्रण और आरएआईआई एक साथ खेल सकते हैं?

मेरी चिंता यह है कि आईओसी एक तरह से आरएआईआई के खिलाफ चला जाता है, क्योंकि हम ऑब्जेक्ट जीवनकाल से संसाधन जीवनकाल को कम करते हैं। क्या यह जटिलता किसी और को परेशान नहीं करती है? और वास्तविक सवाल, चीजों को आसानी से करने के लिए किस तकनीक का उपयोग किया जा सकता है?

+0

यह भी देखें http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc और http://unity.codeplex.com/Thread/View.aspx?ThreadId=38588 – TrueWill

उत्तर

3

इसी कारण से मैंने अपना स्वयं का आईओसी कंटेनर बनाया है जो (सी #/एनईटी में) डिस्पोजेबल सर्विस रैपर लौटाता है, जब निपटान किया जाता है, तो सेवा के संबंध में "सही काम करेगा"।

यह रहें:

  • कुछ भी नहीं है, जब कार्य करें:
    • वस्तु को लागू नहीं करता है IDisposable
    • कंटेनर-दायरे वाले (इस स्थिति में कंटेनर यह और बदले का ट्रैक रखेगा नहीं है एक ही वस्तु एक से अधिक बार, और जब कंटेनर का निपटारा किया जाता है, तो वस्तु भी होगी)
    • यह
    • पूल नहीं है यह सिंगलटन नहीं है -scoped (एक ही कंटेनर-दायरे वाले, लेकिन कंटेनर के एक पदानुक्रम के सर्वोच्च कंटेनर में सिंगलटन-दायरे वाले सेवा की दुकान के रूप में)
  • सेवा के निपटान (यह कारखाना गुंजाइश है, और लागू करता है IDisposable)
  • वापसी यह पूल के लिए

इसका मतलब यह है कि सभी कोड मेरी सेवाओं का उपयोग करता है एक का उपयोग कर-ब्लॉक के अंदर है, लेकिन इरादे कम से कम मेरे लिए और अधिक स्पष्ट है,:

using (var service = container.Resolve<ISomeService>()) 
{ 
    service.Instance.SomeMethod(); 
} 

मूल रूप से यह सा ys: सेवा को हल करें, सेवा उदाहरण पर SomeMethod को कॉल करें, और उसके बाद सेवा का निपटान करें।

सेवा के उदाहरण का निपटान करना है या नहीं, उपभोक्ता के लिए उपलब्ध नहीं है, इसलिए या तो आईडीस्पोजेबल कार्यान्वयन को पूरी तरह से अनदेखा करने या आईडीएसओएसपीबल लागू करने वाली सभी सेवाओं का निपटान करने का विकल्प था। न तो मेरे लिए एक अच्छा समाधान था।तीसरा विकल्प सेवा उदाहरण को किसी ऑब्जेक्ट में लपेटना था जो जानता था कि रैपर का निपटान करने के बाद सेवा के साथ क्या करना है।

+0

कभी-कभी बतख-टाइपिंग 'आईडीस्पोजेबल' अपरिहार्य हो जाता है (जैसे कि किसी प्रकार पर 'foreach' का उपयोग करते हुए, जो उपयोग करने योग्य' GetEnumerator() 'विधि लागू करता है लेकिन 'IEnumerable ' लागू नहीं करता है), लेकिन यह आपके जैसे ही एक बड़ी गंध है इस तथ्य को ध्यान दें कि एक वर्ग में कुछ ऐसा संदर्भ होता है जो 'आईडीस्पोजेबल' लागू करता है, यह हमेशा यह नहीं दर्शाता है कि यह इस प्रकार निर्दिष्ट वस्तु का "मालिक" है। – supercat

0

पहली बात जो मैं सोच सकता था स्मार्टपॉइंटर्स था। और टेम्पलेट तर्क। लेकिन मुझे यकीन नहीं है कि टेम्पलेट तर्क आईओसी तकनीक के रूप में गिना जाता है, हालांकि मुझे लगता है कि उन्हें चाहिए। कम से कम ये आईओसी के साथ कुछ मुद्दों को कम कर सकते हैं, लेकिन इस विचार पर पूरी तरह से बेचा नहीं जाता है।

1

हां और नहीं। आईओसी ऑब्जेक्ट आजीवन से संसाधन जीवनकाल को कम नहीं करता है, यह ऑब्जेक्ट जीवनकाल से विधि आमंत्रण का दायरा रद्द करता है - आप अक्सर ऑब्जेक्ट चाहते हैं जो किसी अन्य आईओसी कॉल किए जाने तक मौजूद होने के तरीके के अंत में नष्ट हो जाएगा। तो आपको या तो कक्षा के दायरे में किसी विधि के स्थानीय लोगों को स्थानांतरित करना होगा, और सुनिश्चित करें कि कोई विधि फिर से प्रवेश नहीं कर रही है, या किसी अन्य दृष्टिकोण को अपनाना है, जैसे कि अतिरिक्त 'पर्यावरण' पास करने के लिए ऑब्जेक्ट्स का स्वामित्व करने की अनुमति देने के लिए, और नष्ट बाद में आईओसी विधि कॉल में। यदि आप एक सामान्य उद्देश्य घटना संचालित प्रणाली चाहते हैं तो या तो दृष्टिकोण काफी जटिल हो जाता है - या तो आपके मॉडल स्पष्ट रिकर्सन को लागू करने और खुद को पुन: लागू करने के लिए समाप्त होते हैं, या आपका सरल RAII C++ कोड तेजी से कॉलबैक का एक बहुत ही जटिल घोंसला बन जाता है - पर्याप्त जटिल जो मैंने छोड़ा सी ++ और आरएआईआई ने kin पर काम करना शुरू कर दिया।

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