हैं IObservable और IObserver .NET (भी इंटरफेस यहाँ और यहाँ )। दिलचस्प है, IObserver का ठोस कार्यान्वयन IObservable का प्रत्यक्ष संदर्भ नहीं रखता है। यह नहीं जानता कि यह किसकी सदस्यता है। यह केवल सदस्यता रद्द कर सकता है। "कृपया पिन को सदस्यता समाप्त करने के लिए खींचें।"
संपादित करें: unsubscriber लागू करता है IDisposable
। मुझे लगता है, इस योजना को व्यपगत श्रोता समस्या को रोकने के लिए नियोजित किया गया था ।
दो बातें मेरे लिए पूरी तरह से स्पष्ट नहीं हैं, हालांकि।
- क्या इनर अनसब्सक्राइबर वर्ग सदस्यता और भूलने का व्यवहार प्रदान करता है? कौन और कब (बिल्कुल)
IDisposable.Dispose()
अनसब्सक्राइबर को कॉल करता है? कचरा संग्राहक (जीसी) नियतात्मक नहीं है।
[अस्वीकरण: कुल मिलाकर, मैंने C और C ++ के साथ C # के साथ अधिक समय बिताया है।] यदि मैं एक पर्यवेक्षक K को एक पर्यवेक्षित L1 की सदस्यता देना चाहता हूं और पर्यवेक्षक को पहले से ही किसी अन्य पर्यवेक्षित L2 की सदस्यता लेनी चाहिए, तो क्या होना चाहिए?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
जब मैंने इस परीक्षण कोड को MSDN के उदाहरण के खिलाफ चलाया, तो पर्यवेक्षक L1 के लिए सदस्यता लिया। यह वास्तविक विकास में अजीबोगरीब होगा। संभावित रूप से, इसमें सुधार करने के लिए 3 रास्ते हैं:
- यदि पर्यवेक्षक के पास पहले से ही एक सदस्यता रद्द उदाहरण है (यानी यह पहले से ही सदस्यता लिया हुआ है), तो यह नए प्रदाता की सदस्यता लेने से पहले मूल प्रदाता से चुपचाप सदस्यता समाप्त कर देता है। यह दृष्टिकोण इस तथ्य को छिपाता है कि यह अब मूल प्रदाता की सदस्यता नहीं है, जो बाद में एक आश्चर्य बन सकता है।
- यदि पर्यवेक्षक के पास पहले से ही एक सदस्यता रद्द उदाहरण है, तो एक अपवाद है। एक सुव्यवस्थित कॉलिंग कोड को पर्यवेक्षक को स्पष्ट रूप से सदस्यता समाप्त करनी होगी।
- पर्यवेक्षक कई प्रदाताओं की सदस्यता लेता है। यह सबसे पेचीदा विकल्प है, लेकिन क्या इसे IObservable और IObserver के साथ लागू किया जा सकता है? चलो देखते हैं। पर्यवेक्षक के लिए यह संभव है कि वह बिना स्रोत वाली वस्तुओं की सूची रखे: प्रत्येक स्रोत के लिए एक। दुर्भाग्य से,
IObserver.OnComplete()
उस प्रदाता को वापस संदर्भ नहीं देता जिसने इसे भेजा है। इसलिए, कई प्रदाताओं के साथ IObserver कार्यान्वयन यह निर्धारित करने में सक्षम नहीं होगा कि कौन से से सदस्यता समाप्त करना है।
क्या .NET के IObserver को कई IObservables की सदस्यता लेने का इरादा था?
क्या पर्यवेक्षक पैटर्न की पाठ्यपुस्तक की परिभाषा के लिए आवश्यक है कि एक पर्यवेक्षक को कई प्रदाताओं की सदस्यता लेने में सक्षम होना चाहिए? या यह वैकल्पिक और कार्यान्वयन पर निर्भर है?