IObservable - Как отправить / опубликовать / отправить новые значения в коллекцию - PullRequest
4 голосов
/ 02 марта 2011

Я хочу выставить IObservable из моего сервисного уровня.

Для простоты скажем, что внутренне сервисный уровень получает сообщение от удаленного сервера (через сокет) и что для библиотеки сокетов требуется объект IMessageReponse, у которого есть метод MessageReceived для передачи ему.

Внутренне уровень службы создает объект MessageResponse и получает уведомление посредством обратного вызова Action при поступлении сообщения.

Учитывая этот дизайн, мне нужно иметь возможность отправлять новые сообщения в IObservable, но в любом из примеров, которые я видел, Observable.XYZ, похоже, не поддерживает простой метод Send / Publish / Push...

Как мне подключить мой Observable.XYZ в этом сценарии ???

Я хочу что-то вроде этого ... заметьте, я знаю, что это очень простая реализация IObservable, но я бы не подумал, что мне нужно будет писать этот код сам ... Я бы подумал, что что-тобыл бы там для меня из коробки.

public class PushObservable<T> : IObservable<T>
{
    private IList<IObserver<T>> _listeners = new List<IObserver<T>>();

    public void Send(T value)
    {
        foreach (var listener in _listeners) 
            listener.OnNext(value); 
    }

    public IDisposable Subscribe(IObserver<T> observer)
    { 
        _listeners.Add(observer);
    }
}

1 Ответ

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

Вы переписали объект, который уже существует! Ваш «PushObservable» на самом деле Subject<T>, и это один из фундаментальных объектов в Rx.

Если вы действительно хотите подумать об этой проблеме с помощью Rx, вы, вероятно, начнете с IObservable<byte[]>, который исходит из сокета, тогда вы бы выбрали это в IObservable<IMessageResponse>, так как в конце день, событие , на которое вы реагируете, - это байты, выходящие из сети.

...