有没有办法在不使用主题的情况下创建热观察?例如,要提供事件样式的可观察对象,您可以使用主题:
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
实现为主题推送一个新值。然而,从那以后,我一直在琢磨它并想知道是否有可能有另一种解决方案,因为我厌恶生产代码中的主题。
答案 0 :(得分:3)
如果我理解你的要求,他们是:
IObservable<T>
OnNext
,OnError
和OnCompleted
这归结为需要实现IObserver<T>
和IObservable<T>
的内容,但只公开公开IObservable<T>
。 ISubject<T>
被定义为实现这两个接口,而Subject<T>
是最简单的实现。
您当前的解决方案尽可能简单明了,其他任何事情都会涉及重新发明Subject<T>
。