У .NET (також тут і тут ) є інтерфейси IObservable та IObserver . Цікаво, що конкретна реалізація IObserver не має прямого посилання на IObservable. Невідомо, на кого він підписаний. Він може викликати лише передплатнику. "Будь ласка, потягніть шпильку, щоб скасувати підписку."
редагувати: Підписка реалізує IDisposable
. Я думаю, ця схема була використана для запобігання проблеми з прослуханим слухачем .
Дві речі мені не зовсім зрозумілі.
- Чи забезпечує внутрішній клас Unsubscriber поведінку підписки та забути? Хто (і коли саме) дзвонить
IDisposable.Dispose()
на скасування підписки? Збір сміття (GC) не є детермінованим.
[Відмова: загалом, я більше часу проводив із C та C ++, ніж із C #.] Що має відбутися, якщо я хочу підписати спостерігача K на спостережуваний L1, а спостерігач вже підписаний на якийсь інший спостерігається L2?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
Коли я запустив цей тестовий код на прикладі MSDN, спостерігач залишився підписаним на L1. Це було б своєрідно в реальному розвитку. Потенційно, існує три шляхи для покращення цього:
- Якщо у спостерігача вже є примірник передплатників (тобто він уже підписаний), він спокійно скасовує підписку від початкового постачальника, перш ніж підписатися на нового. Такий підхід приховує той факт, що він більше не підписався на початкового постачальника, що згодом може стати сюрпризом.
- Якщо спостерігач вже має примірник, який не підписався, то викидає виняток. Добре поведений код виклику повинен скасувати передплату спостерігача.
- Спостерігач підписується на кілька провайдерів. Це найбільш інтригуючий варіант, але чи можна це реалізувати за допомогою IObservable та IObserver? Подивимось. Спостерігачеві можна зберегти список об'єктів, які не підписалися: по одному для кожного джерела. На жаль,
IObserver.OnComplete()
не надає посилання на постачальника, який його надіслав. Таким чином, реалізація IObserver з декількома постачальниками не зможе визначити, з якого потрібно скасувати підписку.
Чи призначений IObserver .NET призначений для підписки на кілька IObservables?
Чи вимагає визначення підручника шаблону спостерігача, щоб один спостерігач мав змогу підписатися на кілька постачальників послуг? Або це необов'язково і залежить від реалізації?