Ci sono interfacce IObservable e IObserver in .NET (anche qui e qui ). È interessante notare che l'implementazione concreta di IObserver non contiene un riferimento diretto a IObservable. Non sa a chi è abbonato. Può solo invocare l'iscritto. "Per favore, tira il perno per annullare l'iscrizione."
modifica: il sottoscrittore implementa il IDisposable
. Penso che questo schema sia stato utilizzato per prevenire il problema dell'ascoltatore decaduto .
Però due cose non sono del tutto chiare per me.
- La classe Unsubscriber interna fornisce il comportamento di iscrizione e dimentica? Chi (e quando esattamente) chiama
IDisposable.Dispose()
l'Iscritto? Il Garbage Collector (GC) non è deterministico.
[Dichiarazione di non responsabilità: nel complesso, ho trascorso più tempo con C e C ++ che con C #.] Cosa dovrebbe accadere se voglio iscrivere un osservatore K a un L1 osservabile e l'osservatore è già abbonato ad un altro L2 osservabile?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
Quando ho eseguito questo codice di test sull'esempio di MSDN, l'osservatore è rimasto abbonato a L1. Ciò sarebbe peculiare nello sviluppo reale. Potenzialmente, ci sono 3 strade per migliorare questo:
- Se l'osservatore ha già un'istanza di annullamento iscrizione (ovvero è già sottoscritta), allora annulla l'iscrizione in silenzio al provider originale prima di iscriversi a una nuova. Questo approccio nasconde il fatto che non è più abbonato al fornitore originale, che potrebbe diventare una sorpresa in seguito.
- Se l'osservatore ha già un'istanza di annullamento sottoscrizione, viene generata un'eccezione. Un codice di chiamata ben educato deve annullare l'iscrizione in modo esplicito all'osservatore.
- Observer si abbona a più provider. Questa è l'opzione più intrigante, ma può essere implementata con IObservable e IObserver? Vediamo. È possibile che l'osservatore mantenga un elenco di oggetti non iscritti: uno per ogni sorgente. Sfortunatamente,
IObserver.OnComplete()
non fornisce un riferimento al provider che lo ha inviato. Pertanto, l'implementazione di IObserver con più provider non sarebbe in grado di determinare da quale annullare l'iscrizione.
IObserver di .NET era destinato alla sottoscrizione a più IObservable?
La definizione da manuale del modello di osservatore richiede che un osservatore sia in grado di abbonarsi a più fornitori? O è facoltativo e dipende dall'implementazione?