Orada IObservable ve IObserver .NET (aynı zamanda arayüzleri burada ve burada ). İlginç bir şekilde, IObserver'ın somut uygulaması IObservable'a doğrudan bir referans içermemektedir. Kime abone olduğunu bilmiyor. Sadece aboneliği iptal edebilir. "Aboneliği iptal etmek için lütfen raptiyeyi çekin."
edit: Unsubscriber uygular IDisposable
. Bence bu şema, dinleyen din problemini önlemek için kullanıldı .
Yine de iki şey benim için tamamen açık değil.
- İç Unsubscriber sınıfı abone ol ve unut davranışını sağlıyor mu?
IDisposable.Dispose()
Aboneliği kim (ve tam olarak ne zaman) çağırıyor ? Çöp toplayıcı (GC) deterministik değildir.
[Feragatname: Genel olarak, C ve C ++ ile C # 'den daha fazla zaman geçirdim.] Bir gözlemci K'yi gözlemlenebilir bir L1'e abone olmak istersem ve gözlemci başka bir gözlemlenebilir L2'ye zaten abone olursa ne olur?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
Bu test kodunu MSDN örneğine karşı çalıştırdığımda, gözlemci L1'e abone kaldı. Bu gerçek gelişimde kendine özgüdür. Potansiyel olarak, bunu iyileştirmek için 3 yol vardır:
- Gözlemcinin zaten bir abonelikten çıkma örneği varsa (yani zaten abone olmuşsa), yenisine abone olmadan önce orijinal sağlayıcıdan sessizce aboneliği iptal eder. Bu yaklaşım, artık orijinal sağlayıcıya abone olmadığı gerçeğini gizler, bu da daha sonra sürpriz olabilir.
- Gözlemcinin zaten abonelikten çıkmış bir örneği varsa, bir istisna atar. İyi davranılmış bir çağrı kodu, gözlemciyi açıkça iptal etmelidir.
- Gözlemci birden çok sağlayıcıya abone olur. Bu en ilginç seçenektir, ancak bu IObservable ve IObserver ile uygulanabilir mi? Bakalım. Gözlemcinin, abone olmayan nesnelerin bir listesini tutması mümkündür: her kaynak için bir tane. Maalesef,
IObserver.OnComplete()
gönderen sağlayıcıya bir referans sağlamaz. Bu nedenle, birden çok sağlayıcı ile IObserver uygulaması hangisinin aboneliğini iptal edeceğini belirleyemez.
.NET'in IObserver'ı birden çok IObservable'a abone olmayı amaçladı mı?
Gözlemci modelinin ders kitabı tanımı, bir gözlemcinin birden çok sağlayıcıya abone olmasını gerektiriyor mu? Yoksa isteğe bağlı ve uygulamaya bağlı mı?