2015-09-04 61 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); 
    } 
}