c# - 通过多个订阅者的 'routing' 事件模式?

标签 c# system.reactive

我有一组具有以下接口(interface)的类:

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()但收效甚微 - 也许我还不够了解。

最佳答案

我已经设法使 Publish 方法起作用,但除了摆脱保留 IDisposables 列表的需要外,它并没有给我太多帮助:

private void Refresh()
{
    _published.DisposeIfNotNull();

    if (_stream != null)
    {
        var connectable = _stream.Publish();
        _published = connectable.Connect();
        var stream = connectable.AsObservable();

        foreach (var eventReceiver in _eventReceivers)
        {
            eventReceiver.Apply(stream);
            stream = stream.Where(eventReceiver.ShouldForwardEvent);
        }
    }
}

关于c# - 通过多个订阅者的 'routing' 事件模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17262494/

相关文章:

c# - 我可以使用可以为 null 的变量进行 MVC 方法重载吗?

angular - 如果我发现自己一直在订阅另一个订阅中的内容,我应该怎么做?

c# - 我可以将 ASP.Net session ID 放在隐藏的表单字段中吗?

c# - 需要算法帮助通过锯齿状数组解析索引

c# - 比较枚举与类,最佳实践?

javascript - 使用 RxJS 模拟命令队列和撤消堆栈

c# - 保存订阅状态以便稍后恢复

c# - HttpWebRequest 的响应不显示 UTF-8 符号

ios - 执行异步任务的轮询请求

c# - 合并从多个实例触发的事件的可观察序列的正确方法