【发布时间】:2014-04-10 00:58:03
【问题描述】:
假设我有一个观察 IObservable 的对象,以便它始终知道某个外部源的当前状态。在内部,我的对象有一个方法使用该外部值作为操作的一部分:
public class MyObject
{
public MyObject(IObservable<T> externalSource) { ... }
public void DoSomething()
{
DoSomethingWith(CurrentT);
}
}
使用 IObservable 来“跟踪当前状态”而不是“响应事件流”的惯用“反应式”方式是什么。
想法 #1 是只监视可观察的值并在它们进入时记下它们。
public class MyObject
{
private T CurrentT;
public MyObject(IObservable<T> externalSource)
{
externalSource.Subscribe((t) => { CurrentT = t; });
}
public void DoSomething()
{
DoSomethingWith(CurrentT);
}
}
这很好,但是跟踪类成员中的状态似乎非常不具反应性。
想法 #2 是使用BehaviorSubject
public class MyObject
{
private readonly BehaviorSubject<T> bs;
public MyObject(BehvaiorSubject<T> externalSource)
{
this.bs = externalSource
}
public void DoSomething()
{
DoSomethingWith(bs.Value);
}
}
但是直接使用主题似乎是不受欢迎的。但至少在这种情况下,我有能力使用只读字段来存储行为主体。
BehaviorSubject(或 ReplaySubject)看起来确实是为此目的而制作的,但这里还有其他更好的方法吗?如果我应该使用主题,将主题作为注入参数,还是将原始可观察对象并在构造函数中本地构建主题更有意义?
(顺便说一句,如果源 observable 尚未触发,我知道需要处理第一个值。不要挂断电话,这不是我要问的)
【问题讨论】:
标签: c# system.reactive