これは、 内部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ではイベントよりも多くの利点があります。
-
IObservable
実装は、必要なことを何でも実行できるクラスです。IObserver
宣言するメソッドにより、シーケンスをより正確に制御できます。 - シーケンスが終了したことを報告し、それによって最後に必要なアクションを実行し、サブスクライブを解除できます。 エラーを管理することは可能です。
- イベントでは、サブスクライブを解除するには、オブザーバーを何らかの変数に保存し、何らかの方法でそれらを管理する必要があります。 Rxでは、
Subscribe
メソッドはIDisposable
を返します。登録解除するには、Dispose()
呼び出すだけです。
var toDispose = sub.Subscribe(Console.WriteLine); toDispose.Dispose();
- Rxには、多くの便利な機能、メソッドのオーバーロード、および拡張機能が含まれています
- LINQ!
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はリアクティブシステムを作成できる優れたツールですが、これは、このスタイルで終了して書き込みを開始する必要があるという意味ではありません。 主なものは、常に灰白質を使用することです!