2016-03-04 9 views
2

在.NET框架本身中是否有IObservable的默認實現,或者我必須使用第三方框架(如Rx)? 我問的原因是我正在嘗試創建一個需要公開IObservable類型屬性的可重用組件,並且我不想將此組件與任何此類第三方框架綁定。在.NET Framework中IObservable的默認實現<T>

編輯:我的意思是第三部分是實施不是BCL的一部分。即使Rx由MS擁有,它也不是核心.NET框架的一部分。

+1

那麼,如果你不想把它與第三方框架,不要。也就是說,Rx不是第三方:) – Luaan

+0

@DStanley - 確實,但在BCL中根本沒有實現「IObservable/IObserver」。 – Lee

+0

爲什麼要在Rx中沒有所有好運算符的'IObservable '?儘管如此,你真的不應該寫自己的實現 - 這很難得到正確的。 Reactive Extensions團隊的人花費了數年的時間纔將它做對。如果你不想引用「第三方」框架,你可以引入你需要的代碼 - 畢竟它是開源的。 – Enigmativity

回答

3

.NET BCL中沒有實現IObservable<T>。這就是說,我強烈建議不要寫自己的。像,真的很強。一百萬。 使用Rx框架。如果有一項政策阻止你這麼做,那就非常非常錯誤。就像你的實現幾乎肯定是如果你自己嘗試一下......這看起來很難正確。 甚至連我工作過的許多投資銀行中的任何一家(當談到第三方代碼時,他們通常都是最大的三色堇)已經足夠愚蠢,不會讓Rx被使用。對於這個建議,我可能會太脆弱,模糊和間接,請原諒我。

+1

我會把所有的大寫'** _ REALLY _ **'加粗! – Michael

1

我個人認爲這是一個很好的問題。 OP想要限制他的依賴關係,從而創建一個更強大的庫。榮譽。

然而,按照現狀,其他評論/答案是從大量的經驗中獲得的。要實現您自己的IObservable<T>/IObserver<T>不是一個好主意。但我也注意到你沒有說你想要。

當前的答案很簡單,沒有 - 在BCL中沒有實現接口的IObservable<T>/IObserver<T>。這是MS的一個有意識的決定,它允許Rx以比BCL更快的速度發展。這意味着實際上你需要通過Nuget來依賴Rx。對於你的代碼真的有什麼功能,它至少需要Rx-Linq(因此Rx-Core & Rx-Interfaces),其中有Observable訪問Observable.CreateInterval靜態類,Empty

如果組件是一個UI組件,那麼你可能需要依賴Rx-MainRx-PlatformServices。幸運的是,Rx版本的節奏現在非常緩慢,並且他們非常謹慎地遵循語義版本控制,所以次要版本的發行版不應該破壞您的代碼並允許您在Rx上具有靈活的依賴關係。這將使你的客戶能夠定位更新版本的Rx,如果他們確實出來,你的lib應該仍然可以正常工作。

+0

感謝您的回答。正如你所說我只是想限制依賴關係。但我不打算寫自己的實現。 – Rajan