2015-09-04 64 views
1

我有一个User模型,它具有IObservable<int>属性。该属性由一个BehaviorSubject支持,该值用特定值初始化。如何获得可观察值的当前值,而无需公开访问底层BehaviorSubject.Value属性的另一个属性?如何获得作为IObservable公开的主题的当前值?

这是样品模型来考虑:

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方法,但他们似乎做了不同于我所期望的事情。当同时尝试时,我的应用程序将无限期阻止。

我找到正确曝光值的唯一方法是创建另一个属性为“当前”值,就像这样:

public int CurrentValue => mySubject.Value; 

我不喜欢这个,因为感觉对我来说,我m是多余的。有没有更好的方法来公开observable的当前值,以便外部代码可以获得该值并按照它的要求执行操作?就此而言,正如我之前评论的那样,我也不是很高兴有另一种方法来改变价值。在我看来,它使得对象的界面变得麻烦。例如,在knockoutjs中,我可以通过“调用”observable来获取和设置值,这看起来更简单。在这种情况下,这将相当于Value()

回答

1

你总是可以执行下列操作之一,具体取决于您是否是在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); 
    } 
}