Reactive Extensions:如何对可观察对象进行分层?

时间:2013-07-03 01:59:21

标签: c# system.reactive

我有一个发布通用消息的服务,我已经为这些消息创建了一个observable。这些消息可以包含任何内容,并且可以在顶层分层不同的协议。

我希望添加第二层可观察来解释这些消息中的特定协议。例如,消息可以是“更新”,“错误”或“完成”类型。我希望重新发布“更新”消息,在“错误”上抛出错误,并在“完成”上完成序列。

我怎样才能干净利落地实现这一目标?

我认为我不能用SelectMany来做这件事;虽然选择器可以为前两种情况返回Observable.Return()Observable.Throw(),但我无法从选择器中完成(调用observer.OnCompleted()并取消订阅底层的observable)。

在我看来,我必须使用Observable.Create()并订阅subscribe方法中的基础observable。我已经做到了,但实现对我来说感觉很奇怪,因为它没有使用在Rx中更常见的功能组合风格。这是正确的方法吗?

public IObservable<Message> InterpretProtocol(IObservable<message> stream)
{
  return Observable.Create<Message>(observer =>
  {
    return stream.Subscribe(message =>
    {
      switch (ProtocolMessageTypeOf(message))
      {
        case ProtocolMessageType.Error:
          observer.OnError(new InvalidOperationException(message));
          break;

        case ProtocolMessageType.Complete:
          observer.OnCompleted();
          break;

        default:
          observer.OnNext(message);
          break;
      }
    });
  });
}

1 个答案:

答案 0 :(得分:2)

您可以尝试以下内容:

public IObservable<Message> InterpretProtocol(IObservable<message> stream) {

  return stream.
         TakeWhile(msg => ProtocolMessageTypeOf(message) != ProtocolMessageType.Complete).
         Select(msg => {
             if(ProtocolMessageTypeOf(message) == ProtocolMessageType.Error)
               throw new InvalidOperationException(message);
             else
               return msg;
        });

}
相关问题