5

मेरे मामले में यह Ninject 2.जब मैं आईओसी का उपयोग करता हूं तो मैं ऑब्जेक्ट निपटान का प्रबंधन कैसे करूं?

// normal explicit dispose 
using (var dc = new EFContext) 
{ 
} 

है लेकिन कभी कभी मैं संदर्भ लंबे समय तक रखने के लिए या समारोह कॉल के बीच की जरूरत है। इसलिए मैं इस व्यवहार को आईओसी स्कोप के माध्यम से नियंत्रित करना चाहता हूं।

// if i use this way. how do i make sure object is disposed. 
var dc = ninject.Get<IContext>() 

// i cannot use this since the scope can change to singleton. right ?? 
using (var dc = ninject.Get<IContext>()) 
{ 
} 

नमूना scopes

Container.Bind<IContext>().To<EFContext>().InSingletonScope(); 
// OR 
Container.Bind<IContext>().To<EFContext>().InRequestScope(); 
+0

डुप्लिकेट: http://stackoverflow.com/questions/987761/how-do-you-reconcile-idisposable-and-ioc – TrueWill

+0

लिंक – Aval

उत्तर

3

जो मुझे पता है (मैंने एक महीने पहले एक शोध किया था) निनजाल जीवन चक्र प्रबंधन का समर्थन नहीं करता है। कैसल विंडसर और ऑटोफैक (और कुछ हद तक स्ट्रक्चर मैप, लेकिन केवल नेस्टेड कंटेनरों का उपयोग करते समय) उचित समय पर डिस्पोजेबल घटकों को डिस्पोजेबल करने का ख्याल रखेंगे।

1

आप IContext के इंटरफेस पर नियंत्रण है, तो इंटरफेस जिसमें से यह विरासत की सूची में IDisposable जोड़ें। यदि नहीं, तो खिन्न IContext आप एक IDisposable को मिलता है ...

var context = ninject.Get<IContext>(); 

using ((IDisposable)context) 
{ 
} 

तुम भी, रचना से यह करने के लिए IContext के इंटरफेस में फेरबदल का विकल्प होता है अगर आप IContext को नियंत्रित ...

public interface IContext 
{ 
    // ... 

    IDisposable GetUsageHandle(); 
} 

var context = ninject.Get<IContext>(); 

using (context.GetUsageHandle()) 
{ 
} 
+0

धन्यवाद के लिए धन्यवाद। क्या होगा अगर मैं उपरोक्त मामले में सिंगलटन में अपना दायरा बदलूं? यह निपटान ठीक है, अगली बार जब मैं उस समारोह को कॉल करता हूं, तो आपको अपवाद मिलता है। – Aval

+0

@Aval: ठीक है, यही कारण है कि आप दूसरे कार्यान्वयन का उपयोग करना चाहते हैं, जहां संदर्भ कुछ ऐसा उत्पन्न करता है जो एक सिंगलटन _not_ डिस्पोजेबल है। बेहतर, फिर भी, आप दूसरा कार्यान्वयन करके शुरू कर सकते हैं बस डिस्पोजेबल ऑब्जेक्ट को वापस कर सकते हैं और उसके बाद क्लाइंट को प्रभावित किए बिना डिस्पोजेबल फ्लाईवेइट्स के साथ सिंगलटन को बदल सकते हैं। –

+0

धन्यवाद, यह वास्तव में मेरी मदद की है। – Aval

1

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

var kernel = new StandardKernel(); 
kernel.Bind<NotifiesWhenDisposed>().ToSelf(); 

NotifiesWhenDisposed instance = null; 
using(var block = new ActivationBlock(kernel)) 
{ 
    instance = block.Get<NotifiesWhenDisposed>(); 
    instance.IsDisposed.ShouldBeFalse(); 
} 

instance.IsDisposed.ShouldBeTrue(); 
संबंधित मुद्दे

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