2014-06-19 43 views
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来实现,只是跟踪订阅者,但感觉就像是完全一样的问题。

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


UPDATE

,我甚至把这么多想进入这个摆在首位的原因。我最近得到了一些遗留代码,其中包含需要删除并替换为可观察事件的事件。所有这些事件都分别设立了以同样的方式:

public event EventHandler MyEvent { add; remove;} 

protected void OnMyEvent() { ... } 

然后散落在整个该类型是OnMyEvent()各种调用。我把它交给了一个初级开发人员,让他们用主题支持的可观察属性取代事件,并让Onxxx实现为这个主题注入了新的价值。但是从那以后,我一直在嘲笑它,并想知道是否还有其他解决方案,因为我厌恶生产代码中的主题。

+0

通常情况下,如果你想使用一个接口,它需要一个实现。只是在说。 –

+0

我知道你的意思,但我想我会把它放在那里,以防万一有一些我错过了。它感觉像一个反模式。 – MojoFilter

+1

真正的问题是:谁在打电话给OnThingHappening,为什么?也许你需要一个主题。也许你没有。但答案在于这个类的使用,而不是它的实现。 –

回答

3

如果我正确地理解您的需求,他们是:

  • 公开公共IObservable<T>
  • 类里面,能够触发其OnNextOnErrorOnCompleted

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

您目前的解决方案尽可能简单直接,其他任何方面都需要您自己重新创建Subject<T>

+0

谢谢。这是我的答案;我只是想通过假设没有更优雅的机制来确保我不是天真的。 – MojoFilter