2011-03-01 2 views
4

내 서비스 계층에서 IObservable을 노출하려고합니다.IObservable - 컬렉션에 새 값을 보내거나 게시/푸시하는 방법

간단히하기 위해 서비스 레이어가 내부적으로 소켓을 통해 원격 서버에서 메시지를 가져 오는 중이고 소켓 라이브러리에 MessageReceived 메서드가 전달되는 IMessageReponse의 개체가 필요하다고 말할 수 있습니다.

내부적으로 서비스 계층은 MessageResponse 객체를 생성하고 메시지가 도착하면 Action 콜백에 의해 통지를받습니다.

이 디자인을 감안할 때 새로운 메시지를 IObservable에 푸시 할 수 있어야하지만 Observable.XYZ는 간단한 보내기/게시/푸시 방식을 지원하지 않는 것 같습니다.

이 시나리오에서 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 모두) 중 하나를 보면 이것이 거의 효과가 있습니다. –

+0

내부 서비스 계층을 IObservable로 노출하고 싶은지, 아니면 IObservable에서 자신의 메시지를 추가로 보내려는 것인지 질문을 명확히 할 수 있습니까? –

답변

5

이미 존재하는 개체를 다시 작성했습니다! "PushObservable"은 실제로 Subject<T>이며 Rx의 기본 개체 중 하나입니다.

Rx 방식으로이 문제에 대해 정말로 생각하고 싶다면 소켓에서 오는 IObservable<byte[]>으로 시작하는 것이 좋을 것입니다. IObservable<IMessageResponse>으로 선택하십시오. 당신이 응답하는 이벤트은 와이어에서 오는 바이트입니다.

관련 문제