我有一組類具有以下接口:通過幾個用戶「路由」事件的模式?
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'直接工作。有沒有像'void Process(T anEvent)'而不是'Apply()'這樣的東西更有意義? –
svick
不在我的情況。接收器必須能夠在事件流上使用Rx操作符。我可以改變'ShouldForwardEvent'方法來獲取並返回一個'IObservable'與隱式合約,即源流應該被返回 - 但我不喜歡隱式合約(並且在簡單的時候不需要額外的功能'Where where'就足夠了) –
AlexFoxGill