没有主题的热观察

时间:2014-06-19 20:24:44

标签: .net system.reactive reactive-programming subject

有没有办法在不使用主题的情况下创建热观察?例如,要提供事件样式的可观察对象,您可以使用主题:

class MySouce
{
    private Subject<string> thingsSubject = new Subject<string>();
    public IObservable<string> ThingsThatHappen
    {
        get { return this.thingsSubject; }
    }

    private void OnThingHappening(string thing)
    {
        this.thingsSubject.OnNext(thing);
    }
}

我不讨厌它,但我不喜欢使用主题。感觉使用它会引入额外的状态和生命周期管理问题。我知道我可以使用Observable.Create实现并只跟踪订阅者,但这感觉就像完全相同的问题。

是否有更优雅的解决方案,或者我只是因为担心它而迂腐?


更新

我首先考虑到这一点的原因。我最近获得了一些遗留代码,其中的类型包含需要删除并用observable替换的事件。所有这些事件都以相同的方式设置:

public event EventHandler MyEvent { add; remove;}

protected void OnMyEvent() { ... }

然后分散在整个类型中的是对OnMyEvent()的各种调用。我把它交给了一个初级开发人员,让他们用主题支持的可观察属性替换事件,让Onxxx实现为主题推送一个新值。然而,从那以后,我一直在琢磨它并想知道是否有可能有另一种解决方案,因为我厌恶生产代码中的主题。

1 个答案:

答案 0 :(得分:3)

如果我理解你的要求,他们是:

  • 公开公开IObservable<T>
  • 在课堂内,可以触发其OnNextOnErrorOnCompleted

这归结为需要实现IObserver<T>IObservable<T>的内容,但只公开公开IObservable<T>ISubject<T>被定义为实现这两个接口,而Subject<T>是最简单的实现。

您当前的解决方案尽可能简单明了,其他任何事情都会涉及重新发明Subject<T>

相关问题