मैं डीई के रूप में कार्यान्वयन वर्ग में इंटरफेस को मैप करने के लिए एमईएफ का उपयोग करता हूं। उदाहरण के लिए, मैं एक इंटरफ़ेस के लिए आयात विशेषता का उपयोग करता हूं, और कार्यान्वयन कक्षा के लिए निर्यात करता हूं। मेरी समझ यह है कि एमईएफ ढांचा कार्यान्वयन कक्षा के उदाहरण बनाएगा और उन्हें उपयोग या ऑटो इंजेक्शन के लिए एमईएफ के कंटेनर में रखेगा।MEF कंटेनर द्वारा घटकों का निपटान करें?
मेरे कुछ कार्यान्वयन वर्ग IDISpose इंटरफ़ेस को लागू करते हैं। चूंकि एमईएफ द्वारा उदाहरण बनाए गए हैं, मुझे लगता है कि एमईएफ बाहर होने पर मुझे डिस्पोजेबल होने पर एमईएफ को घटकों को निपटाने के लिए कहा जाना चाहिए। उदाहरण के लिए, मेरे आवेदन में, मैं एमईएफ के कंटेनर का संदर्भ रखता हूं। जब आवेदन समाप्त हो जाता है, तो मैं कंटेनर की निपटान विधि को कॉल करता हूं। समस्या यह है कि मेरे घटकों का निपटान कभी नहीं कहा जाता है। समान तरीके से अन्य मैपिंग के लिए
[Import]
private IMyInterface IComponent1 { get; set; }
....
[Export]
private IMyInterface Component {
get {
var instance = new MyImplemetation();
....
return instance;
}
}
....
कई अन्य आयात और निर्यात परिभाषाएँ:
यहाँ आयात और निर्यात मानचित्रण के बारे में कुछ उदाहरण कोड है। मैं इस तरह से मैपिंग का निर्माण करता हूं ताकि एमईएफ के संबंधों का ज्ञान हो और मैप किए गए उदाहरण कैसे बनाएं।
var catalog = new AggregateCatalog();
catalog.Add (new AssemblyCatalog(Assembly.GetExecutingAssembly());
var batch = new CompositionBatch();
batch.AddPart(catalog);
// MEF container has all the mappings
var container = new CompositionContainer(catalog);
....
// Get instance from container
var instance = container.GetExportedValue<IMyInterface>();
// my instance CTOR has a contructor with several other
// implementation instances injected by interface
// instance starts to do its job and coordinates others ...
instance.Start();
....
// Finally the job is done.
// Dispose the container explicitly there.
container.Dispose();
// But my components are never disposed
// this results some connections not being closed
// file streams not being closed...
यहाँ उदाहरण कई अन्य घटकों MEF द्वारा ctor के माध्यम से इंजेक्शन है: यहाँ अपने आवेदन में कुछ कोड AssemblyCatalog का उपयोग करके मैपिंग लोड करने के लिए कर रहे हैं। उन घटकों में अन्य घटक भी होते हैं जिन्हें एमईएफ द्वारा इंजेक्शन दिया जाता है। समस्या यह है कि कुछ उदाहरण साझा किए जाने के बाद घटकों को निपटाने के लिए निर्णय करना वाकई मुश्किल है। अगर मैंने एक पर निपटान कहा है, तो इससे दूसरों को इसका उपयोग करने में सक्षम नहीं होगा। जैसा कि आप इस तस्वीर में देख सकते हैं, एमईएफ द्वारा उदाहरण बनाए जाते हैं और मेरे आवेदन कक्षाओं में इंजेक्शन दिए जाते हैं। प्रत्येक घटक को दूसरों का कोई ज्ञान नहीं होना चाहिए, और इसे नौकरी करने के लिए इंजेक्शन घटकों का उपयोग करना चाहिए।
मुझे यकीन नहीं है कि कॉल करने के लिए एमईएफ को कहां/कैसे निर्देशित किया जाना चाहिए जब आवेदन समाप्त हो जाता है या कंटेनर का निपटारा किया जाता है? क्या मुझे घटकों पर निपटान करना चाहिए? मुझे नहीं लगता कि यह सही है क्योंकि एमईएफ उन्हें बनाता है और उन्हें आवश्यकतानुसार ग्राहकों में इंजेक्ट करता है। ग्राहकों को अपनी नौकरियों को खत्म करते समय अपना निपटान नहीं करना चाहिए।
मुझे लगता है कि डैनियल ने इसे अच्छी तरह से समझाया। मैंने अपनी निर्यात संपत्ति गेटटर में उदाहरण बनाया था। यह घटना को पकड़ने और वहां से साफ करने के लिए समझ में आता है। मैं कक्षा के बजाय गेटटर पर निर्यात करना पसंद करता हूं। मैं इसका परीक्षण करूंगा और आपको बता दूंगा कि इससे समस्या हल हो जाएगी या नहीं। –