2010-07-16 21 views
7

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

चुनौती यह है कि मैं किसी भी कक्षा को संशोधित नहीं कर सकता जिसे मैं लोड कर दूंगा, क्योंकि मैं उनके स्रोत कोड को नियंत्रित नहीं करता हूं।

मेरे द्वारा बनाए गए उदाहरणों को ट्रैक करना सरल है, मैं उन्हें कुछ प्रकार के संग्रह में डाल सकता हूं क्योंकि मैं उन्हें बना देता हूं। उनके विनाश को ट्रैक करने से मुझे समस्याएं आ रही हैं। अगर मैं स्रोत कोड को संशोधित कर सकता हूं, तो मैं प्रत्येक कक्षा में एक ईवेंट जोड़ूंगा और जब मैं एक उदाहरण बनाउंगा, तो मैं इस कार्यक्रम में शामिल होगा और इसे मेरी अधिसूचना के रूप में उपयोग करूंगा। लेकिन मैं ऐसा नहीं कर सकता।

तो, सवाल यह है: क्या ऑब्जेक्ट इंस्टेंस की निगरानी करने और इसे नष्ट होने पर पता लगाने के लिए कोई चुस्त तरीका है?

उत्तर

3

सक्रिय अधिसूचना प्राप्त करने का कोई तरीका नहीं है, लेकिन आप वस्तुओं को WeakReference रख सकते हैं और समय-समय पर जांच सकते हैं कि कोई मर गया है या नहीं।

संपादित करें: मुझे रीड का जवाब मेरी तुलना में बेहतर पसंद है!

+0

+1 यह मजाकिया है - मैं वही सटीक बात सोच रहा था, जब तक कि मैंने उस हिस्से को पढ़ा जहां उसने कहा कि वह वस्तुओं के निर्माण को नियंत्रित कर रहा था;) –

+0

यह वास्तव में ऐसा लगता है कि यह मेरी स्थिति में सबसे व्यावहारिक समाधान हो सकता है, मैं यह कोशिश करने जा रहा हूँ। –

+0

मुझे आपकी रीड की तुलना में बेहतर पसंद है क्योंकि इसका मतलब है कि उन प्रकार के ग्राहकों को विशेष सजावटी प्रकार के बारे में जानने की आवश्यकता नहीं है –

0

कैसे के बारे में आप वस्तु के विनाश को नियंत्रित:

public void Destroy(T obj) 
{ 
    if (obj == null) 
     throw new ArgumentNullException("obj"); 
    if (!_living.Contains(obj)) 
     throw new ArgumentException("Where did this obj come from?"); 

    using (obj as IDisposable) 
    { 

    } 

    _living.Remove(obj); // List? 
} 
+0

तो क्या नष्ट कॉल()? याद रखें कि मैं जिन प्रकारों को लोड कर रहा हूं उन्हें नियंत्रित नहीं कर सकता (वास्तव में वे एक फ़ोल्डर से गतिशील रूप से लोड होते हैं और मुझे पहले से पता नहीं होता कि मैं वहां क्या पाउंगा)। –

10

आप वस्तुओं बना रहे हैं के बाद से, ऐसा लगता है जैसे आप एक Decorator लौट सकते हैं वास्तविक उदाहरण के बजाय।

Decorator Pattern का उपयोग करके, आप लौटे ऑब्जेक्ट को अपने स्वयं के, सजाए गए एपीआई में "लपेट" सकते हैं। सजावट एक आईडीस्पोजेबल कार्यान्वयन प्रदान कर सकती है जो आपके विनाश अधिसूचना प्रदान करती है।

+0

यह अच्छा है। आप सजावटी को उत्पन्न करने के लिए पूर्णता का उपयोग कर सकते हैं। कक्षा बहुत बड़ी है तो यह महत्वपूर्ण होगा। – ChaosPandion

+0

यह बहुत दिलचस्प है, मैं इसका पालन करूंगा। धन्यवाद। –

2

आप उदाहरणों के लिए संदर्भ की एक सूची पकड़ तो आपके द्वारा बनाए गए वे कचरा एकत्र नहीं किया जाएगा और इसलिए नष्ट किया जा कभी नहीं होगा ...

इसके बजाय आप एक रिपोजिटरी कि GUIDs की एक सूची रखती बना सकते हैं और बनाने प्रत्येक इंस्टेंस के लिए एक नया ग्रिड और उसके बाद इसे एक सूची में जोड़ें - फैक्ट्री रिपोजिटरी की तरह कुछ। इस तरह आपके पास कचरा संग्रह के लिए संदर्भ समस्या नहीं है क्योंकि गिड्स संदर्भ प्रकारों के बजाय structs हैं। इसके बाद आप प्रत्येक वर्ग से एक प्रकार का निर्माण कर सकते हैं जो विनाश पर सूचित कर सकता है। मुझे लगता है कि चूंकि आप मूल कक्षाओं के कोड को नहीं बदल सकते हैं, इसलिए आप इन वर्गों के उपभोक्ताओं को भी बदल नहीं सकते हैं, इसलिए सजावट पैटर्न (इंटरफ़ेस के माध्यम से) जैसे कुछ ऐसा इसलिए है क्योंकि प्रकार संगत नहीं होंगे।

बहुत सरल उदाहरण:

public class OriginalClassDestroyNotifier : OriginalClass 
{ 
    private readonly Guid _instanceId; 

    public OriginalClassDestroyNotifier(Guid instanceId) 
    { 
     _instanceId = instanceId; 
    } 

    ~OriginalClassDestroyNotifier() 
    { 
     FactoryRepository.NotifyDestroyed(_instanceId); 
    } 
} 
संबंधित मुद्दे