Ada IObservable dan IObserver interface di NET (juga di sini dan di sini ). Menariknya, implementasi konkret dari IObserver tidak memiliki referensi langsung ke IObservable. Tidak tahu dengan siapa berlangganannya. Itu hanya dapat memanggil unsubscriber. "Silakan tarik pin untuk berhenti berlangganan."
edit: The unsubscriber mengimplementasikan IDisposable
. Saya pikir, skema ini digunakan untuk mencegah masalah pendengar yang murtad .
Namun, ada dua hal yang tidak sepenuhnya jelas bagi saya.
- Apakah kelas Unsubscriber dalam menyediakan perilaku berlangganan dan lupa? Siapa (dan kapan tepatnya) memanggil
IDisposable.Dispose()
Unsubscriber? Pengumpul sampah (GC) tidak deterministik.
[Penafian: secara keseluruhan, saya menghabiskan lebih banyak waktu dengan C dan C ++ daripada dengan C #.] Apa yang harus terjadi jika saya ingin berlangganan pengamat K ke L1 yang dapat diamati dan pengamat sudah berlangganan beberapa L2 yang dapat diamati?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
Ketika saya menjalankan kode tes ini terhadap contoh MSDN, pengamat tetap berlangganan L1. Ini akan menjadi khas dalam pengembangan nyata. Secara potensial, ada 3 jalan untuk meningkatkan ini:
- Jika pengamat sudah memiliki contoh unsubscriber (yaitu sudah berlangganan), maka diam-diam berhenti berlangganan dari penyedia asli sebelum berlangganan yang baru. Pendekatan ini menyembunyikan fakta bahwa itu tidak lagi berlangganan ke penyedia asli, yang mungkin akan mengejutkan nanti.
- Jika pengamat sudah memiliki contoh unsubscriber, maka dilemparkan pengecualian. Kode panggilan yang baik harus berhenti berlangganan pengamat secara eksplisit.
- Pengamat berlangganan beberapa penyedia. Ini adalah opsi yang paling menarik, tetapi bisakah ini diimplementasikan dengan IObservable dan IObserver? Ayo lihat. Adalah mungkin bagi pengamat untuk menyimpan daftar objek unsubscriber: satu untuk setiap sumber. Sayangnya,
IObserver.OnComplete()
tidak memberikan referensi kembali ke penyedia yang telah mengirimnya. Jadi, implementasi IObserver dengan beberapa penyedia tidak akan dapat menentukan dari yang berlangganan.
Apakah .NET IObserver dimaksudkan untuk berlangganan beberapa IObservables?
Apakah definisi buku teks dari pola pengamat mensyaratkan bahwa satu pengamat harus dapat berlangganan ke beberapa penyedia? Atau apakah itu opsional dan tergantung pada implementasi?