Ci sono IObservable e IObserver interfacce in .NET (anche qui e here ). È interessante notare che l'implementazione concreta di IObserver non contiene un riferimento diretto a IObservable. Non sa a chi è abbonato. Può solo invocare l'unsubscriber. "Si prega di tirare il perno per annullare l'iscrizione."
modifica: il unsubscriber implementa IDisposable
. Penso che questo schema sia stato utilizzato per prevenire il problema del listener scaduto .
Però due cose non mi sono del tutto chiare.
- La classe Unsubscriber interna fornisce il comportamento subscribe-and-forget? Chi (e quando esattamente) chiama
IDisposable.Dispose()
sul Unsubscriber? Garbage Collector (GC) non è deterministico.
[Disclaimer: nel complesso, ho trascorso più tempo con C e C ++ rispetto a C #.] -
Cosa dovrebbe succedere se voglio iscrivere un osservatore K ad un osservabile L1 e l'osservatore è già iscritto 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 contro l'esempio di MSDN, l'osservatore è rimasto iscritto su L1. Questo sarebbe peculiare nello sviluppo reale. Potenzialmente, ci sono 3 strade per migliorare questo:
- Se l'osservatore ha già un'istanza di annullamento dell'iscrizione (vale a dire è già iscritto), quindi annulla la sottoscrizione dal provider originale prima di abbonarsi a una nuova. Questo approccio nasconde il fatto che non è più sottoscritto al fornitore originale, che potrebbe diventare una sorpresa in seguito.
- Se l'osservatore ha già un'istanza di unsubscriber, allora viene generata un'eccezione. Un codice chiamante ben educato deve annullare l'iscrizione esplicitamente all'osservatore.
- Observer si iscrive a più provider. Questa è l'opzione più intrigante, ma può essere implementata con IObservable e IObserver? Vediamo. È possibile per l'osservatore tenere un elenco di oggetti non iscritti: uno per ciascuna fonte. Sfortunatamente,
IObserver.OnComplete()
non fornisce un riferimento al fornitore che l'ha inviato. Pertanto, l'implementazione IObserver con più provider non sarebbe in grado di determinare da quale disiscriversi.
-
L'IObserver di .NET era destinato alla sottoscrizione a più IObservables?
La definizione da manuale del modello di osservatore richiede che un osservatore debba essere in grado di abbonarsi a più fornitori? O è opzionale e dipende dall'implementazione?