มีอินเทอร์เฟซIObservableและIObserverใน. NET ( ที่นี่และที่นี่ด้วย ) ที่น่าสนใจคือการใช้งาน IObserver อย่างเป็นรูปธรรมไม่ได้ถือการอ้างอิงโดยตรงกับ IObservable ไม่รู้ว่าใครเป็นสมาชิก มันสามารถเรียก unsubscriber เท่านั้น "โปรดดึงหมุดเพื่อยกเลิกการสมัคร"
แก้ไข:ดำเนิน unsubscriber IDisposable
ผมคิดว่าโครงการนี้ถูกจ้างมาเพื่อป้องกันไม่ให้ปัญหาผ่านพ้นไปฟัง
แม้ว่าสองสิ่งนั้นยังไม่ชัดเจนนักสำหรับฉัน
- ชั้น Unsubscriber ภายในให้พฤติกรรมการสมัครและลืม? ใคร (และเมื่อใด) โทร
IDisposable.Dispose()
ไปที่ Unsubscriber? ตัวรวบรวมขยะ (GC) ไม่ได้กำหนดไว้ล่วงหน้า
[ข้อจำกัดความรับผิดชอบ: โดยรวมฉันใช้เวลากับ C และ C ++ มากกว่า C # แล้ว] จะเกิดอะไรขึ้นถ้าฉันต้องการสมัครเป็นผู้สังเกตการณ์ K กับ L1 ที่สังเกตได้และผู้สังเกตการณ์ได้สมัครสมาชิก L2 ที่สังเกตได้อื่นแล้ว
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
เมื่อฉันรันโค้ดทดสอบนี้กับตัวอย่างของ MSDN ผู้สังเกตการณ์ยังคงสมัครเป็นสมาชิกของ L1 นี่จะแปลกในการพัฒนาที่แท้จริง อาจมีลู่ทาง 3 ทางในการปรับปรุงสิ่งนี้:
- หากผู้สังเกตการณ์มีอินสแตนซ์ unsubscriber (เช่นสมัครสมาชิกแล้ว) ก็จะยกเลิกการสมัครสมาชิกอย่างเงียบ ๆ จากผู้ให้บริการดั้งเดิมก่อนสมัครเป็นสมาชิกใหม่ วิธีนี้ซ่อนความจริงที่ว่ามันไม่ได้สมัครเป็นสมาชิกกับผู้ให้บริการเดิมอีกต่อไปซึ่งอาจแปลกใจในภายหลัง
- หากผู้สังเกตการณ์มีอินสแตนซ์ unsubscriber อยู่แสดงว่ามีข้อยกเว้น รหัสการโทรที่มีความประพฤติดีจะต้องยกเลิกการสมัครของผู้สังเกตการณ์อย่างชัดเจน
- ผู้สังเกตการณ์สมัครรับข้อมูลจากผู้ให้บริการหลายราย นี่เป็นตัวเลือกที่น่าสนใจที่สุด แต่สิ่งนี้สามารถนำไปใช้กับ IObservable และ IObserver ได้หรือไม่? มาดูกัน. เป็นไปได้สำหรับผู้สังเกตการณ์ที่จะเก็บรายการของวัตถุผู้สมัครสมาชิก: หนึ่งรายการสำหรับแต่ละแหล่งข้อมูล น่าเสียดายที่
IObserver.OnComplete()
ไม่ได้ให้ข้อมูลอ้างอิงกลับไปยังผู้ให้บริการที่ส่งมา ดังนั้นการใช้งาน IObserver กับผู้ให้บริการหลายรายจะไม่สามารถกำหนดได้ว่าจะยกเลิกการสมัครใด
IObserver ของ. NET มีไว้สำหรับการสมัครสมาชิกหลาย IObservables หรือไม่
นิยามตำราเรียนของรูปแบบผู้สังเกตการณ์กำหนดให้ผู้สังเกตการณ์คนใดคนหนึ่งต้องสามารถสมัครสมาชิกกับผู้ให้บริการหลาย ๆ คนได้หรือไม่? หรือมันเป็นตัวเลือกและขึ้นอยู่กับการใช้งาน?