Реактивные расширения IObservable уведомляют, когда подписчики подписываются - PullRequest
2 голосов
/ 29 марта 2011

У меня есть Subject<T>, и я хочу получать уведомления, когда что-то подписывается на него.Я не могу найти механизм для этого.Я что-то пропустил?

Например:

    public class AccountManager
    {
        private ReplaySubject<string> _accountEvents = new ReplaySubject<string>();

        public AccountManager()
        {
        }

        public void Add(string val)
        {
            _accountEvents.OnNext(val);
        }

        public IObservable<string> AccountEvents { get { return _accountEvents.AsObservable<string>(); } }

    }

Может ли AccountManager получать уведомление, когда любой другой код вызывает Subscribe для свойства AccountEvents.

Ответы [ 2 ]

5 голосов
/ 29 марта 2011

Либо это

        var subj = new Subject<string>();
        var o = Observable.CreateWithDisposable<string>(observer =>
                                            {
                                                Console.WriteLine("subscribed");
                                                return subj.Subscribe(observer);
                                            });

или (аналогично ответу Скотта)

        var o = Observable.Defer(() =>
                                     {
                                         Console.WriteLine("subscribed");
                                         return subj;
                                     });

В первом случае у вас больше свободы, так как у вас есть наблюдатель, переданный в качестве параметра, поэтому в дополнение к маршрутизации вывода субъекта наблюдателю вы можете вызвать Наблюдатель. OnNext, OnError, OnComplete, когда ваша логика требует этого.

0 голосов
/ 29 марта 2011

Это все безобразно, но, возможно, можно заставить работать

var subj = new Subject<string>();
var io = Observable.Defer(() => Observable.Return("Subscribed")
                                          .Do(Console.WriteLine))
                   .Concat(subj);
 io.Subscribe();
...