2

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

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并仅跟踪订阅者,但这感觉就像是完全相同的问题。

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


更新

我什至一开始就考虑这么多的原因。我最近收到了一些遗留代码,其类型包含需要删除并替换为可观察对象的事件。所有这些事件都以相同的方式设置:

public event EventHandler MyEvent { add; remove;}

protected void OnMyEvent() { ... }

然后分散在整个那种类型的是各种调用OnMyEvent()。我把它交给了一位初级开发人员,让他们用主题支持的可观察属性替换事件,并让Onxxx实现为主题推送一个新值。不过,从那以后,鉴于我对生产代码中的主题的反感,我一直对此感到不安,并想知道是否还有其他解决方案。

4

1 回答 1

3

如果我正确理解您的要求,它们是:

  • 公开IObservable<T>
  • 在类内部,能够触发其OnNext,OnErrorOnCompleted

这归结为需要实现IObserver<T>IObservable<T>的东西,但只IObservable<T>公开公开。ISubject<T>定义为实现这两个接口,aplainSubject<T>是它最简单的实现。

您当前的解决方案尽可能简单明了,其他任何事情都将涉及重塑Subject<T>自己。

于 2014-06-20T00:45:58.650 回答