如何将主题的当前值暴露为IObservable?

时间:2015-09-04 12:06:41

标签: .net system.reactive observable

我的User模型具有IObservable<int>属性。此属性由BehaviorSubject支持,该.Value使用特定值进行初始化。如何获取observable的当前值,而不必暴露另一个访问基础BehaviorSubject上的class User { private readonly BehaviorSubject<int> mySubject; public User() { mySubject = new BehaviorSubject<int>(100); } public IObservable<int> Value => mySubject.DistinctUntilChanged(); public void SomeMethod(int level) { mySubject.OnNext(level); } } 属性的属性?

这是要考虑的样本模型:

OnNext

请注意,我有一个方法,使用指定的值调用主题上的Value。这对我来说已经很奇怪了,如果我可以将IObservable observable视为get和set属性而不是唉......那会更好。

在我的代码的另一部分,我需要命令性地获取给定用户的当前值,而我似乎无法直接从Latest接口找到一种方法。我尝试使用MostRecentpublic int CurrentValue => mySubject.Value; 方法,但它们似乎做的不同于我的预期。尝试两者时,我的应用程序无限期地阻止。

我发现正确公开价值的唯一方法是为&#34;当前&#34;创建另一个属性。价值,像这样:

Value()

我不喜欢这样,因为我觉得我是多余的。有没有更好的方法来公开observable的当前值,以便外部代码可以获得值并用它做它想要的东西?就此而言,正如我之前评论的那样,我也不太乐意使用另一种方法来改变价值。在我看来,它使对象的界面变得麻烦。例如,在knockoutjs中,我可以通过&#34;调用&#34;来获取和设置值。可观察的,似乎更简单。在这种情况下,这相当于hsv

1 个答案:

答案 0 :(得分:2)

您可以随时执行其中一项操作,具体取决于您是否处于async上下文中:

var value = await user.Value.FirstAsync();
var value = user.Value.First();

或者,您可以这样做:

class User
{
    private readonly BehaviorSubject<int> valueSubject;
    public int Value
    {
        get { return valueSubject.Value; }
        set { valueSubject.OnNext(value); }
    }
    public IObservable<int> ValueChanged => valueSubject.DistinctUntilChanged();

    public User()
    {
        valueSubject = new BehaviorSubject<int>(100);
    }
}