2011-03-01 65 views
4

我想從我的服務層公開IObservable。IObservable - 如何發送/發佈/將新值推送到集合

爲了簡單起見,可以說內部服務層從遠程服務器(通過套接字)獲取消息,並且套接字庫需要具有MessageReceived方法的IMessageReponse對象傳遞給它。

服務層內部創建MessageResponse對象,並在消息到達時通過Action回調得到通知。

鑑於這種設計,我需要能夠推到的IObservable但在任何我見過的例子新消息,Observable.XYZ似乎並不支持簡單的發送/發佈/ 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); 
    } 
} 
+0

如果您反編譯RX庫並查看其中一個主題(IObservers和IObservables),這就是他們的工作原理。 – 2011-03-01 22:37:14

+0

您能澄清一下這個問題嗎?您是要將內部服務層公開爲IObservable,還是另外希望將自己的消息發送出IObservable? – 2011-03-02 03:44:10

回答

5

你已經改寫了一個已經存在的對象!你的「PushObservable」實際上是Subject<T>,它是Rx中的基本對象之一。

如果你真的想用Rx的方式來思考這個問題,你可能會先從套接字IObservable<byte[]>開始,然後你會選擇IObservable<IMessageResponse>,因爲在一天結束時, 事件您正在響應的是字節來自線路。