【发布时间】:2013-06-23 15:51:21
【问题描述】:
我有一组具有以下接口的类:
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(),但收效甚微——也许我不太了解。
【问题讨论】:
-
我发现你的界面不一致:你直接使用
IObservable<T>和T。用void Process(T anEvent)代替Apply()这样的东西不是更有意义吗? -
不是我的情况。接收者必须能够在事件流上使用 Rx 运算符。我可以更改
ShouldForwardEvent方法以获取并返回一个IObservable<T>,其中包含应返回源流的隐式契约——但我不喜欢隐式契约(并且在简单的@ 时不需要额外的功能) 987654334@就够了)
标签: c# system.reactive