2010-04-14 18 views
9

यह मेरे लिए सिफारिश की गई थी कि, जब एक आईओसी कंटेनर का उपयोग कर, मैं इस बदलना चाहिए:आईओसी कंटेनर और IDisposable

class Foobar: IFoobar, IDisposable {}; 
इस में

:

interface IFoobar: IDisposable{}; 
class Foobar : IFoobar{}; 

मैं सोच रहा हूँ अगर यह ठीक है , या अगर यह एक समस्या हल करता है और दूसरा बनाता है। यह निश्चित रूप से समस्या है जहाँ मैं बुरी तरह से ऐसा करना चाहते हैं को हल करती है:

using(IFoobar = myContainer.Resolve<IFoobar>()) 
{ ... } 

और अब मुझे पता है कि किसी भी विकल्प एक रन-टाइम त्रुटि पैदा नहीं होगी।

दूसरी तरफ, अब मेरे सभी नकली वस्तुओं को भी IDISposable को संभालना होगा। क्या मैं सही हूं कि किसी भी मॉकिंग फ्रेमवर्क ने इसे आसानी से संभाला है? यदि हां, तो शायद यह एक गैर-मुद्दा है।

या यह है? क्या कोई और छुपा गचाचा है जिसके लिए मुझे देखना चाहिए? यह निश्चित रूप से मेरे लिए होता है कि यदि मैं एक आईओसी कंटेनर का उपयोग यूनिट परीक्षण/मॉकिंग के लिए नहीं कर रहा था, लेकिन सच्ची सेवा आजादी के लिए, तो यह एक समस्या हो सकती है क्योंकि शायद मेरी स्वीकार्य सेवाओं में से केवल एक ही अप्रबंधित संसाधनों से संबंधित है (और अब मैं ' मैं इन अन्य सेवाओं में खाली "पहचान" संचालन को लागू करने के लिए है)।

यहां तक ​​कि यह बाद का मुद्दा मुझे लगता है कि मैं "उपयोग" कथन को नियोजित करने की क्षमता प्राप्त करने के लिए, साथ ही ऊपर डेमो के रूप में काम करने की क्षमता प्राप्त करने के लिए भी रह सकता हूं। लेकिन क्या मैं एक लोकप्रिय सम्मेलन का पालन कर रहा हूं, या क्या मैं पूरी तरह से अलग और बेहतर समाधान खो रहा हूं?

+3

किसने इसकी अनुशंसा की? किस कंटेनर के लिए? –

+0

आपने यह भी देखा है http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc? –

+0

ऊपर दिखाया गया तकनीक किसी अन्य इंजीनियर द्वारा सुझाया गया था जिसके साथ मैं काम करता हूं। और हाँ, मैंने पहले से ही उस स्टैक ओवरफ्लो लिंक को देखा था। असल में, इसने मुझे यह अन्य धागा शुरू करने के लिए प्रेरित किया: http://groups.google.com/group/structuremap-users/browse_thread/thread/6be80baf98c25820 संक्षेप में सिफारिश थी (1) IDISposable ऑब्जेक्ट्स का उपयोग न करें एकता या (2) एकता का उपयोग न करें। इसके बारे में, यह मुझे कुल 3 सिफारिशें देता है। –

उत्तर

10

आईडीस्पोज़ेबल से इंटरफ़ेस प्राप्त करना मेरी राय में एक डिजाइन गंध है जो लीकी एब्स्ट्रक्शन इंगित करता है। निकोलस ब्लूमहार्ट put it:

एक इंटरफ़ेस [...] आमतौर पर डिस्पोजेबल नहीं होना चाहिए। इंटरफ़ेस को परिभाषित करने के लिए कोई भी तरीका नहीं है, इसके सभी कार्यान्वयन को देखने के लिए - आप हमेशा व्यावहारिक रूप से किसी भी इंटरफ़ेस के डिस्पोजेबल कार्यान्वयन के साथ आ सकते हैं।

विचार करें कि आप अपने इंटरफ़ेस में IDISposable क्यों जोड़ना चाहते हैं। ऐसा शायद इसलिए है क्योंकि आपके पास दिमाग में एक विशेष कार्यान्वयन है। इसलिए, कार्यान्वयन अमूर्तता में लीक।

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

मुझे पता है कि कम से कम कैसल विंडसर और ऑटोफैक यह करता है। विशेष रूप से चर्चा के बारे में Owned<T> -

class Foobar: IFoobar, IDisposable {}; 

आप दिलचस्प रूप में अच्छी तरह निकोलस Blumhardt पद The Relationship Zoo मिल सकता है:

तो आपके मामले में, आप अपने प्रकार इस तरह रखना चाहिए।

+0

अच्छा जवाब। सब अच्छा लगता है। – Jehof

+0

सीमित संसाधन पहुंच (डेटाबेस, हार्डवेयर, आदि) के लिए सत्र इंटरफेस के बारे में क्या? क्या यह इनके लिए उपयुक्त है? –

+0

पहचान योग्य या 'स्वामित्व ', लेकिन यह मूल रूप से एक ही चीज़ पर उबाल जाता है। यह अभी भी एक गंध है, लेकिन कभी-कभी यह आवश्यक हो सकता है। कोई व्यक्ति वैकल्पिक रूप से कार्य पैटर्न की इकाई पर विचार कर सकता है, लेकिन यहां तक ​​कि वह भी अंतर्निहित समस्या से पीड़ित है। गंध से अवगत होना महत्वपूर्ण है, लेकिन कभी-कभी इसे टालने का कोई तरीका नहीं है:/ –

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