我有一组具有以下接口的类:
public interface RoutedEventReceiver<T>
{
IDisposable Apply(IObservable<T> stream);
bool ShouldForwardEvent(T anEvent);
}
我想做的是维护这些类的堆栈,每个事件都通过ShouldForwardEvent(T)
谓词过滤,并将结果IObservable<T>
传递给下一个接收者。我还希望能够在程序运行时推送和弹出新的接收器(有时我可能想从堆栈移动到其他集合,但现在堆栈就足够了)。
我目前所拥有的确实有效,但我觉得它不是很“Rx”。我确信必须有一种方法可以在没有所有这些命令式逻辑的情况下做我想做的事:
private void Refresh()
{
// _subscriptions is a list of previous subscriptions
foreach (var subscription in _subscriptions)
subscription.Dispose();
_subscriptions.Clear();
// _stream is my stream of incoming events
if (_stream != null)
{
var stream = _stream;
foreach (var eventReceiver in _eventReceivers)
{
// add the subscription so it can be disposed next Refresh()
_subscriptions.Add(eventReceiver.Apply(stream));
// filter the stream for the next event receiver
stream = stream.Where(eventReceiver.ShouldForwardEvent);
}
}
}
Push
每当我或Pop
在堆栈上时,都会调用上述方法。
是否有一种更简洁、更实用的方式来表达上述意图?我尝试过.Publish()
,但收效甚微——也许我还不够了解。