非同期インターフェイスを宣言的に操作できるLINQの非常に興味深い拡張機能に出会いました(
themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html )。 現在、この拡張機能はSilverlight Toolkit(Rxフレームワーク)の一部として存在しますが、後に.NET 4.0(System.Reactive.dll)の一部になります。
考え方は、IEnumerableインターフェイスとIObservableインターフェイスの間の境界を消去することです(IteratorパターンとObserverパターンの間で読み取ります)。 非同期イベントは、yield returnのように返されるデータのシーケンスとして表されます。 そしてこれにより、LINQを介して機能的で宣言的なスタイルでこのシーケンスを操作できます。
たとえば、LINQを使用して、コントロールのドラッグに関する式を定式化できます。
IObservable < Event < MouseEventArgs >> draggingEvent =
from mouseLeftDownEvent in control.GetMouseLeftDown()
from mouseMoveEvent in control.GetMouseMove().Until(control.GetMouseLeftUp())
select mouseMoveEvent;
式は次のようになります。左マウスボタンをクリックするたびに、左マウスボタンが押されるまで各マウス移動イベントを取得します。
したがって、fromにより、イベントのシーケンスを宣言的に記述することができます。 それ以外の場合は、状態マシンを作成し、左マウスボタンをクリックするためのフラグを設定する必要があります。 そして、マウス移動ハンドラーでこのフラグをテストし、それに応じてハンドラーの動作を変更します。 Rxフレームワークを使用すると、一連のイベントを宣言的に記述でき、追加の変数を導入することはできません。
同様に、状態から状態への遷移は瞬時ではなく、アニメーションで発生するGUIをテストできます。アニメーションの終了は、コントロールプロパティにアクセスする前に待機する必要があります。
Rating rating = new Rating ();
IObservable < Unit > test =
ObservableExtensions
.DoAsync(() => TestPanel .Children.Add(rating)) //
.WaitFor( TestPanel .GetLayoutUpdated()) //
.DoAsync(() => rating.Value = 1.0) //
.WaitFor(
rating
.GetActualValueChanged() //
.SkipWhile(actualValueChangedEvent => //
actualValueChangedEvent.EventArgs.NewValue != rating.Value))
.Assert(() => rating.GetRatingItems().Last().ActualValue == 1.0); // Assert
//
test.Subscribe(() => TestPanel .Children.Remove(rating));
元の投稿の著者は、近い将来、このフレームワークを使用したスレッド間の相互作用を強調することを約束しています。
適用分野
- ビジュアルユーザーインターフェイス用の宇宙船の構築。
- ワークフローイベントを調整します。
- 周辺機器とメッセージを調整します。 ネットワーク(Webサービス)および非同期IOを含む。
- イベントのチェーンを操作します。
WPFへの適応
silverlight.codeplex.com/SourceControl/ListDownloadableCommits.aspxevain.net/blog/articles/2009/07/30/rebasing-system-reactive-to-the-net-clrWPFに適合したコードのブランチはまだないようですが、.NET 4.0に追加することを約束します。 ただし、今は手動で生データを取得してより深く掘り下げることができます。
バインド可能なLINQ
アイデアの開発は、宣言的に記述された一連のイベントへのバインディングの実装です。 依存プロパティが変更されると、GUIは再描画して変更を反映します。 Rxでは、これは今ではありません。 ただし、次のプロジェクトにはINotifyPropertyChangedと同様の接続があります(プロジェクト自体はまだ見ていません)。
- Obtics-www.codeplex.com/Obtics
- バインド可能なLinq-www.codeplex.com/bindablelinq
- CLinq-clinq.codeplex.com