次のインターフェイスを持つクラスのグループがあります。
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);
}
}
}
上記のメソッドは、IPush
またはPop
スタック上でいつでも呼び出されます。
上記の意図を表現するための、よりクリーンで機能的な方法はありますか? 私は試してみ.Publish()
ましたが、ほとんど成功しませんでした - おそらく私はそれを十分に知りません.