2015-09-01 27 views
1

我試圖將Observable項目傳遞給存儲庫層。在IObservable中傳遞<T>方法

我有接口

public interface Repository{ 
    IObservable<INotification<bool>> Save(IObservable<T> objects); 
} 

我無法測試這一點,並沒有發現人在做這樣的事情的任何實例。

這是不好的設計Rx明智嗎?我想保存一連串的結果,並讓存儲庫根據它自己的語義緩衝它們。例如,存儲庫的實現在Buffer()的控制下。

這樣做的部分原因是,當對象流關閉時,允許save方法緩衝/刷新最後一項。它可能會更頻繁地做到這一點,但從更高的層面來說,我不在乎。

編輯:

我感到非常愚蠢的有關測試,顯然是我在嘲笑的具體調用可觀察到的,而如果我使用的重放,甚至做的一個具體實例,實際上是一個新實例導致我的模擬返回null的對象。

雖然我仍然對這種模式感到好奇。

+0

「我在測試這個問題時遇到了麻煩」 - 遇到麻煩是因爲/有什麼麻煩? – tolanj

+0

從理論上講,它是有效的。實際上,這可能是無用的,因爲'IObservable'很難與普通的序列化。NET應用程序集成工具(WCF,OData等),除非您計劃在一個應用程序內使用此接口 – supertopi

+1

是的,這種類型的失敗的目的是序列化(我想現在我的應用程序正在關閉!),因爲'Observerable'controls完成的步伐。 – paulpdaniels

回答

1

我認爲值得考慮一下接口的可能語義。

public interface Repository 
{ 
    IObservable<INotification<bool>> Save<T>(IObservable<T> objects); 
} 

可觀察objects可以是熱的或冷,並且它可以包含連續值之間的延遲,並且它可以是無限的。你可能不會設想你的消費者稱之爲「不利」的可觀察性,但他們可能會這樣做。

此外,結果是可觀察的。那麼,下面的代碼應該是什麼意思?

var results = repository.Save(myObservableObjects); 

這可能會觸發保存或它可能無能爲力!

您可能需要執行以下操作來實際觸發保存:

results.Subscribe(...); 

然後,如果兩個或更多的觀察者訂閱可觀察到的結果會是什麼結果呢?它會只返回現有的結果嗎?它會觸發源可觀察對象中的新保存嗎?

這種存儲庫的語義太多了。

在我看來,這是接口,您需要:

public interface Repository 
{ 
    Task<INotification<bool>> Save<T>(T item); 
} 

然後,你可以這樣做:

IObservable<INotification<bool>> results = 
    from item in items 
    from result in Observable.FromAsync(() => repository.Save(item)) 
    select result; 

這實際上就爲您提供了完整的簽名,你本來想,但你完全控制查詢的執行,所以你知道什麼是保存和什麼時候。

相關問題