2012-12-06 20 views
6

मैं सोच रहा हूं कि DI का उपयोग करके किसी ऑब्जेक्ट को कैसे प्रबंधित किया जाए। मान लीजिए मैं एक वर्गप्रबंधनीय डिस्पोजेबल कक्षाएं निर्भरता इंजेक्शन

class Foo : IFoo, IDisposable 
{ 
    // ... 
} 

तो इस वर्ग एक और वर्ग में इंजेक्ट किया जाता है

class Bar 
{ 
    public Bar(IFoo foo) 
    { 
     this.Foo = foo 
    } 

    IFoo Foo { get; set; } 
} 

तो मैं कुछ दायरे में इस बाँध (मेरे उदाहरण MVC और Ninject का उपयोग करता है)

this.Bind<IFoo>().To<Foo>().InRequestScope(); 

मैं मैं सोच रहा हूं, क्योंकि निर्भरता इंजेक्शन फ्रेमवर्क Foo के जीवन चक्र को संभालता है, क्या मुझे Bar में IDISpoable लागू करना चाहिए? मेरा विचार यह है कि डी Foo के जीवन चक्र का प्रबंधन कर रहा है, इसलिए अगर कोई अन्य वर्ग Foo का उपयोग कर रहा है तो इसे स्पर्श न करें। इसके अतिरिक्त, क्योंकि डिस्पोजेबल वस्तु एक निर्माता पैरामीटर के रूप में Bar में पारित हो जाता, Bar नहीं रैप एक डिस्पोजेबल वस्तु करता है, तो यह पता नहीं है कि कैसे Bar के फोन करने वाले FooBar के बाद कचरा एकत्र किया जाता है का उपयोग करना चाहता है। क्या यह सही है?

+1

निकोलस ब्लूमहार्ट के पास इस विषय पर ऑटोफैक्ट का उपयोग करके एक उदाहरण के रूप में एक महान पोस्ट है, लेकिन सामान्य रूप से लागू है http://nblumhardt.com/2011/01/an-autofac-lifetime-primer/ – fsimonazzi

+0

कुछ एमएसडीएन लेखों को देखते हुए, यह ऐसा लगता है कि माइक्रोसॉफ्ट दोनों ही करेगा: http://msdn.microsoft.com/en-us/library/yhfzs7at%28v=vs.110%29 (StremReader) "StreamReader ऑब्जेक्ट स्ट्रीम स्ट्रीमर पर प्रदत्त स्ट्रीम ऑब्जेक्ट पर निपटान() को कॉल करता है .इस्हें " " कहा जाता है लेकिन http://msdn.microsoft.com/en-us/library/z7ha67kw%28v=vs.110%29 (बिटमैप) "आपको बिटमैप के जीवनकाल के लिए स्ट्रीम को खोलना होगा। " – Michael

उत्तर

3

हां आपकी धारणाएं सही हैं। Ninject आपके लिए वस्तु का निपटान करेगा।

+0

परीक्षण करते समय मुझे एहसास हुआ। मुझे लगता है कि मेरा मुख्य सवाल यह है कि, किसी ऑब्जेक्ट का निपटान करने के लिए कौन जिम्मेदार है। खोज के आधार पर मेरा निष्कर्ष यह था कि जिस वस्तु ने डिस्पोजेबल ऑब्जेक्ट बनाया है वह इसे निपटाने के लिए ज़िम्मेदार है। तो, इस मामले में निंजा। – Michael

3

जीवन भर के प्रबंधन की यह सामान्य समस्या है। मूल नियम यह है कि वह जो वस्तु बनाता है वह उस उदाहरण का स्वामित्व है। मालिक को उस उदाहरण का निपटान/नष्ट करना चाहिए। स्वामित्व किसी और को पास किया जा सकता है, जो उस घटना को नष्ट करने के लिए जिम्मेदार 'कोई और' बनाता है।

आपके मामले में फू इंस्टेंस बार द्वारा नहीं बनाया गया है, इसलिए बार उस उदाहरण को निपटाने के लिए ज़िम्मेदार नहीं है। चूंकि निनजेक ने आपके लिए यह उदाहरण बनाया है, इसलिए यह साफ-सफाई के लिए ज़िम्मेदार है।

स्वामित्व पारित किया जा सकता है, लेकिन यह कुछ स्पष्ट होना चाहिए।

IFoo CreateNewFoo(); 

हालांकि इस विधि नए IFoo उदाहरणों बनाता है, यह बहुत स्पष्ट है कि वह स्वामित्व वापस फोन करने वाले के पास रहता है: स्पष्ट स्वामित्व गुजर का एक अच्छा उदाहरण फैक्टरी डिजाइन पैटर्न है।

स्वामित्व पारित करने के बीएडी तरीके का एक अच्छा उदाहरण है .NET की StreamReader कक्षा। यह अपने कन्स्ट्रक्टर में एक डिस्पोजेबल ऑब्जेक्ट लेता है, लेकिन यह स्वामित्व लेता है। यद्यपि प्रलेखन में कहा गया है कि वर्ग दिए गए ऑब्जेक्ट का निपटारा करता है, यह व्यवहार कई डेवलपर्स को चमकता है, क्योंकि यह स्वामित्व के सामान्य नियम के खिलाफ जाता है। अंततः माइक्रोसॉफ्ट ने इसे सीटीओआर अधिभार जोड़कर .NET 4.5 में तय किया जो दिए गए स्ट्रीम के निपटारे को दबाने की अनुमति देता है।