リアクティブ拡張





これは、 内部Sync.NET会議に基づく2番目の出版物です。 最初の出版物は、.NETでのマルチスレッドに関するものでした。



ジェット拡張-とてもクールに聞こえるので、ジェット機との接続が必要です。 もちろん接続はありませんが、それは本当に素晴らしいツールです。 リアクティブとは、リアクティブ(react)という言葉に由来し、システムが状態の変化に応答することを理解しています。 ソフトウェア開発のプロセスでは、システムが多くのデータソースに応答し、安定し、異なるモジュールが密接に接続されないようにする必要がありました。



原則として、呼び出すメソッドと関数があるコードを記述し、結果を取得して処理します。 次に、Rxを使用すると、イベントとそれらに応答するハンドラーを作成できます。 したがって、システムは状態の変化を報告し、それらに適切に応答する一連のイベントで構成されます。



Rxは、.NET 4.0以降のSystem名前空間の2つの基本的な抽象化、つまりSystem.IObserver



System.IObservable



ます。 名前が示すように、これはObserverパターンの実装です。 この実装では、 IObservable



subject



として機能し、 IObservable



が変更をサブスクライブできるオブザーバーであることは明らかです。 .NETプラットフォームには、イベント形式のオブザーバー実装が既にあります。 既に述べたように、Rxを使用すると一連のイベントを作成できますが、これはイベントを使用して実行できることは言うまでもありません。 Rxとイベントの操作方法は異なりますが、それについては後で詳しく説明します。



IObserver <T>



通知を受信するメカニズムを提供します。 インターフェイスは3つのメソッドを宣言します。



void OnNext(T value)



-シーケンス内の次の要素を提供します。



void OnError(Exception ex)



- void OnError(Exception ex)



を渡して適切に処理できます。 このメッセージの後、シーケンスは終了し、オブザーバーは変更を追跡する必要がなくなります。



void OnCompleated()



-シーケンスが終了し、新しいメッセージがなくなると報告されます。それらを期待する必要はありません。



IObservable<out >





通知を生成し、オブザーバーがサブスクライブできるようにします。 1つのメソッドを宣言します。



IDisposable Subscribe(IObserver<> observer)



-オブザーバー(IObserver)パラメーターを受け入れ、メッセージに署名します。 メソッドはIDisposable



返すことに注意してください。このメソッドを使用してDispose



メソッドを呼び出すと、オブザーバーのサブスクライブを解除して破棄できます。



IObservable



を実装する場合は、 Subscribe



メソッドに加えて、新しいメッセージ、エラーを送信したり、シーケンスの終わりを報告したりできるロジックを実装する必要があります。 IObservable



インターフェイスを実装する必要もあることがIObservable



ます。そのような目的のために、 Subject



タイプを使用できます。 ただし、それを使用するには、 Nuget



で追加のライブラリ( Install-Package Rx-Mail



)をインストールする必要があります。これは、追加の拡張機能とLINQ



を使用する機能も提供します。



 using System; using System.Reactive.Subjects; namespace Demo { class Program { static Subject<int> sub = new Subject<int>();//Declare static void Main() { sub.Subscribe(Console.WriteLine); //Subscribe sub.OnNext(234); //Publish } } }
      
      







この例では、新しいシーケンス、つまりSubject<in>



Subject<in>



のシーケンスを呼び出すこともできます)が作成され、その後、オブザーバーがサブスクライブし(この場合、シーケンスの各値は単にコンソールに表示されます)、コンソールに表示される値オブザーバーの助け。 新しいオブザーバーが署名するたびに、シーケンスの要素が彼に配信され始めます。 ただし、動作が異なる実装がいくつかあります。



ReplaySubject





 using System; using System.Reactive.Subjects; namespace Demo { class Program { static ReplaySubject<int> sub = new ReplaySubject<int>(); static void Main() { sub.OnNext(222); sub.Subscribe(Console.WriteLine); sub.OnNext(354); } } }
      
      







ReplaySubject



オブザーバーがいつ署名されたかに関係なく、シーケンスのすべての要素を配信します。



BehaviorSubject





 using System; using System.Reactive.Subjects; namespace DemoData { class Program { static BehaviorSubject<int> sub = new BehaviorSubject<int>(666); static void Main() { sub.OnNext(222); sub.Subscribe(Console.WriteLine); // 222 } } }
      
      







BehaviorSubject



空にすることはできず、常に要素が含まれますが、最後の要素のみが含まれます。



AsyncSubject





 using System; using System.Reactive.Subjects; namespace DemoData { class Program { static AsyncSubject<int> sub = new AsyncSubject<int>(); static void Main(string[] args) { sub.OnNext(222); sub.Subscribe(Console.WriteLine); sub.OnCompleted(); // Publish 222 } } }
      
      







AsyncSubject



最後の値のみを返しますが、他の実装とは異なり、 OnCompleated



呼び出されたときにデータが公開されます。



イベントと比較すると、コードは次のようになります。



 using System; namespace Demo { class Program { static event Action<int> Ev; //Declare static void Main(string[] args) { Ev += Console.WriteLine; //Subscribe Ev(234); //Publish } } }
      
      







すべてが非常に単純で、実行は同じように進みますが、Rxではイベントよりも多くの利点があります。





 var toDispose = sub.Subscribe(Console.WriteLine); toDispose.Dispose();
      
      









LINQ





LINQ



最初に静的データソースを照会できました。 しかし、データの量が増え、アプローチが変わるにつれて、これに適応する必要があります。 Rxを使用すると、動的シーケンスを照会できます。



 using System.Reactive.Linq; //   LINQ namespace Demo { class Program { static void Main() { var sequence = Observable.Range(1, 10, Scheduler.Default); //    1  10 var query = from s in sequence where s % 2 == 0 select s; //  ,    sequence.Subscribe(Console.WriteLine); //   (1,2,3,4,5,6,7,8,9,10) query.Subscribe(Console.WriteLine); //   (2,4,6,8,10) } } }
      
      







この例では、1から10のint型のデータを提供するシーケンスが最初に作成され、次にLINQ式が適用され、シーケンスから2の倍数のみが選択されます。したがって、異なるオブザーバーにサブスクライブできる2つの異なるシーケンスを取得します。 これは非常に単純な例ですが、Rxには非常に多くの柔軟性を提供する非常に多くのメソッドが用意されています。



結論



リアクティブ拡張機能を使用すると、システムの状態を監視してそれに応答する個別のモジュールを作成できます。 システムの各部分は、モジュールの残りの部分について何も知らないため、完全に独立しています。 オブザーバーは順番の変更を期待し、彼女は誰が彼女の変更を見ているかを気にしません。 したがって、モジュールの接続性が達成されます。 UIイベント、ドメインイベント、環境の変更、サードパーティサービス(RSS、Twitterなど)の変更を処理するためにRxを使用するのは理にかなっています。 Rxは、イベントをIObservable



に変換する機能も提供します。これにより、システムへの統合が可能になります。



静的シーケンスをIObservable



に変換するためにRxを使用しないでIObservable



。これはリソースの浪費であり、メリットはありません。 また、キューは完全に異なるアプローチであるため、キューを実装しないでください。 大きな利点は、RxがLINQ



をサポートし、新しいことを学ぶ必要がないという事実です。



Rxはリアクティブシステムを作成できる優れたツールですが、これは、このスタイルで終了して書き込みを開始する必要があるという意味ではありません。 主なものは、常に灰白質を使用することです!



All Articles