我如何获得一个主题的当前值暴露为IObservable



我有一个具有IObservable<int>属性的User模型。该属性由初始化为特定值的BehaviorSubject支持。我怎样才能得到可观察对象的当前值,而不必暴露访问BehaviorSubject上的.Value属性的另一个属性?

这是要考虑的示例模型:

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可观察对象当作get和set属性,那就更好了,但是唉……

在我的代码的另一部分,我需要命令式地获得给定用户的当前值,我似乎找不到从IObservable接口直接做到这一点的方法。我尝试使用LatestMostRecent方法,但它们似乎比我期望的做不同的事情。当两者都尝试时,我的应用程序会无限期地阻塞。

我发现正确地暴露该值的唯一方法是为"current"值创建另一个属性,如下所示:

public int CurrentValue => mySubject.Value;
我不喜欢这样,因为我觉得我是多余的。有没有更好的方法来暴露当前值的可观察对象,使外部代码可以得到的值,并做它想要的?对于这个问题,正如我前面所评论的,我也不太乐意使用另一个方法来改变值。在我看来,它使对象的接口变得很麻烦。例如,在knockoutjs中,我可以通过"调用"可观察对象来获取和设置值,这似乎更简单。在这种情况下,这相当于Value()

你总是可以这样做,这取决于你是否在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);
    }
}

相关内容

  • 没有找到相关文章