2009-07-24 21 views
8

.NET 4.0で提供されるSystem.Reactiveライブラリの新しいIObservable/IObserverフレームワークは非常にエキサイティングです(thisおよびthisリンクを参照)。IObservableにIQueryableのような追加機能がありますか? (.NET Rx)

推測が早すぎるかもしれませんが、これらの新しいインターフェイス用に構築されたIQueryableのようなフレームワークもあります(より良い用語がないため)。

特定の使用例は、受信コールのチェーンではなく、ソースでのイベントの前処理を支援することです。たとえば、「chatty」イベントインターフェイスがある場合、Subscribe().Where(...)を使用すると、パイプラインを通じてすべてのイベントが受信され、クライアントはフィルタ処理を行います。

IQueryableObservableに類似したものがあり、これらのLINQメソッドがソースで「スマートな」実装に「コンパイル」されるのではないかと疑問に思っています。このようなフレームワークを使用できる特定のネットワークサーバーアーキテクチャを想像することができます。または、.NETコードが新しいデータ通知(コード内のトリガー)を受け取ることを可能にするSQL Server(またはそのようなRDBMS)へのアドオンについては、サーバーサイドでフィルタリングされた通知が必要です。

答えて

8

これは、IQbservable(IQueryableObservableと発音される)の形式で、Rxの最新リリースで入手しました。来週早々に上映される、チャンネル9のビデオを待ってください。

  • データモデルを使用すると、ターゲットとしているされています

    は、この機能を少し位置づけるためには、受信/ 1×パズルと概念的に3つの直交軸がある認識すべきです。ここでは、プルベースモデルとプッシュベースモデルを見つける。それらの関係は、二重性に基づいています。これらの世界の間には変換が存在します(ToEnumerableなど)。
  • クエリを駆動する操作(sensu lato)を実行します。特定の演算子には並行性が必要です。これは、スケジューリングとISchedulerインターフェイスが入っている場所です。演算子は、並行性ドメイン(ObserveOnなど)の間をホップするために存在します。
  • クエリ式を実行する必要があります。逐語(IL)または翻訳可能(表現木)のいずれか。彼らの関係はhomoiconicityに基づいています。両方の表現間に変換が存在します(AsQueryableなど)。

すべてのIQbservableインターフェイス(これはIQueryableとIObservableクエリの式ツリー表現の両方に対応しています)は、最後のポイントです。時には、クエリ変換(「どのように」実行するか)をリモート側のアスペクト(「どこ」を実行するか)と混同することがあります。通常、クエリをいくつかのターゲット言語(WQL、PowerShell、クラウド通知サービス用のDSQLなど)に変換し、リモートターゲットシステムに変換すると、両方の問題を切り離すことができます。たとえば、式ツリー表現を使用してローカルクエリの最適化を行うことができます。

セキュリティ上の懸念事項に関しては、これはIQueryableの機能と変わりありません。典型的には、式言語を遠隔操作するだけで、 "真に副作用の"演算子はありません(基本主義関数以外の言語の意味を問わず)。特に、購読と実行の操作はローカルに置かれ、クエリ可能なモナドから脱出します(したがって、GetEnumeratorがIQueryableの世界で行うように、翻訳を開始します)。どのようにあなたが購読の行為を遠隔にするかは、私が読者の想像力に任せるものです。

今日はlatest bitsで遊んでみて、あなたの意見をお知らせください。また、この新しい機能に関する今後のChannel 9ビデオについては、そのデザイン哲学の議論を含めて、お楽しみください。将来への

+1

IQObservableについて議論しているChannel 9のBartのビデオをチェックしてください:http://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Observations-on-IQbservable-The-Dual-of-IQueryable –

3

これは興味深い可能性があるように聞こえるが、私はこれを実装することについていくつかの留保があるだろう。

1)IQueryableで使用される重要でないラムダ式をシリアル化できないのと同様に、これらをRxにシリアル化することも同様に困難です。このフレームワークの一部として、複数行およびステートメントラムダをシリアル化できるようにしたいと考えています。そのためには、Erik Meijerの他のペットプロジェクト、DryadとVoltaのようなものを実装する必要があるでしょう。

2)これらのラムダ式をシリアル化できたとしても、クライアントから送信されたサーバー上で任意のコードを実行する可能性が懸念されます。これは、クロスサイトスクリプティングよりもはるかに大きなセキュリティ上の懸念を容易に引き起こす可能性があります。私は、クライアントがサーバーに式を送信して実行させることによる潜在的な利益が、セキュリティ上の脆弱性の影響よりも大きいことは疑いの余地があります。

+0

こんにちはジムに関する詳しい情報については、RXXの連中は、これらのセキュリティ上の問題を持っているTCP IQbservableプロバイダを、出して...しかし、彼らしています動的なものとデバッグ式以外のすべてをシリアライズすることができます...セキュリティの部分を除いて、良いもの... ...まだ、それはalhpaです。 :) –

0

リアクティブフレームワークで解決できると思う1つの問題は、可能であれば、Webサービスや他のプルオンリーサービスからのキャッシュされたデータの通知を変更するための排出とサブスクリプティングです。

0

それは、本質的にそう、LINQツーオブジェクトスタイルのクエリになりますが、.NET 4

のBCLにIObserver/IObservableのためのLINQのサポートがあることを、新しいchannel9 interviewに基づいて、表示されますこの段階では、「スマート購読」のようには見えません。それは限り、基本的な実装では、(上記のインタビューから私の理解から).NET 4に行くようだ

、反応性フレームワーク(Rxは)IObserver/IObservableのより詳細な実装を持っている、またはあなたのことを言いましたSubscribeのパラメータをExpression<Func...>に入力してから、FuncのExpression Treeを使用して、購読しているイベントチャネルに合ったよりスマートな方法で購読することができます。

1

8年:私はRx.Netベースの照会可能反応TCPサーバープロバイダ それは

サーバー「質問に質問」への答えである、Qactive(旧RXX)つまずい

Observable 
    .Interval(TimeSpan.FromSeconds(1)) 
    .ServeQbservableTcp(new IPEndPoint(IPAddress.Loopback, 3205)); 

クライアント

var datasourceAddress = new IPEndPoint(IPAddress.Loopback, 3205); 
var datasource = new TcpQbservableClient<long>(datasourceAddress); 

(
    from value in datasource.Query() 
    //The code below is actually executed on the server 
    where value <= 5 || value >= 8 
    select value 
) 
.Subscribe(Console.WriteLine); 

何が吹いているのは、クライアントが受信するデータをいつ、どのくらい頻繁に伝えることができ、サーバーは、いつ、どのくらいの頻度でどれだけのデータを返すかを制限し、制御できるということです。

このhttps://github.com/RxDave/Qactive

別blog.sample

https://sachabarbs.wordpress.com/2016/12/23/rx-over-the-wire/

関連する問題