В .NET есть интерфейсы IObservable и IObserver (также здесь и здесь ). Интересно, что конкретная реализация IObserver не содержит прямой ссылки на IObservable. Он не знает, на кого он подписан. Это может только вызвать отписчика. «Пожалуйста, потяните за булавку, чтобы отписаться».
редактировать: отписчик реализует IDisposable
. Я думаю, эта схема была использована для предотвращения проблемы с прослушиванием .
Две вещи мне не совсем понятны.
- Обеспечивает ли внутренний класс Unsubscriber поведение подписки и забывания? Кто (и когда именно) звонит
IDisposable.Dispose()
Unsubscriber? Сборщик мусора (GC) не является детерминированным.
[Отказ от ответственности: в целом, я провел больше времени с C и C ++, чем с C #.] Что должно произойти, если я хочу подписать наблюдателя K на наблюдаемый L1, а наблюдатель уже подписан на какой-то другой наблюдаемый L2?
K.Subscribe(L1); K.Subscribe(L2); K.Unsubscribe(); L1.PublishObservation(1003); L2.PublishObservation(1004);
Когда я запускал этот тестовый код на примере MSDN, наблюдатель оставался подписанным на L1. Это было бы особенным в реальном развитии. Потенциально, есть 3 пути для улучшения этого:
- Если у наблюдателя уже есть экземпляр отписчика (т. Е. Он уже подписан), то он тихо отписывается от исходного провайдера перед подпиской на нового. Этот подход скрывает тот факт, что он больше не подписан на первоначального поставщика, что может стать неожиданностью позже.
- Если у наблюдателя уже есть экземпляр отписчика, он вызывает исключение. Правильный код вызова должен явно отписаться от наблюдателя.
- Обозреватель подписывается на несколько поставщиков. Это наиболее интригующий вариант, но может ли он быть реализован с помощью IObservable и IObserver? Посмотрим. Наблюдатель может вести список неподписанных объектов: по одному для каждого источника. К сожалению,
IObserver.OnComplete()
не предоставляет ссылку обратно поставщику, который его отправил. Таким образом, реализация IObserver с несколькими провайдерами не сможет определить, от кого отписаться.
Был ли IObserver .NET предназначен для подписки на несколько IObserable?
Требуется ли из определения шаблона наблюдателя в учебнике, что один наблюдатель должен иметь возможность подписаться на несколько поставщиков? Или это необязательно и зависит от реализации?