有没有办法在不使用主题的情况下创建一个热门的可观察对象?例如,要提供一个事件样式的可观察对象,你可以使用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);
}
}
我不讨厌它,但是我不喜欢使用Subject。感觉使用它会引入额外的状态和生命周期管理问题。我知道我可以使用Observable.Create
实现并且只跟踪订阅者,但这感觉是完全相同的问题。
是否有更优雅的解决方案,还是我一开始就担心它只是迂腐?
我花这么多心思在这件事上的原因。我最近得到了一些遗留代码,其中包含需要删除的事件类型,并将其替换为可观察对象。所有这些事件都以同样的方式设置:
public event EventHandler MyEvent { add; remove;}
protected void OnMyEvent() { ... }
然后分散在整个类型中是对OnMyEvent()
的各种调用。我把它交给了一个初级开发人员,让他们用对象支持的可观察属性替换事件,并让Onxxx
实现向对象推送一个新值。但是,从那时起,我一直在担心它,并想知道是否可能有另一种解决方案,因为我讨厌产品代码中的主题。
如果我理解正确的话,你们的要求是:
- 公开
IObservable<T>
- 在类中,能够触发它的
OnNext
,OnError
和OnCompleted
这归结为需要实现IObserver<T>
和IObservable<T>
的东西,但只公开IObservable<T>
。ISubject<T>
被定义为实现这两个接口,一个普通的Subject<T>
是它最简单的实现。
你目前的解决方案是尽可能简单直接的,其他任何事情都需要你自己重新设计一个Subject<T>
。