the sea of fertility

C#er blog - http://ugaya40.net より移転。今度のブログは落ちない

RxFlowについて


ugaya40/RxFlow · GitHub

RxFlowとは?

RxFlowはRx( Reactive Extensions )を用いてフロー制御を行うためのライブラリです。
現在の業務でネットワークアクセスを含む分岐点の多いバッチ処理を書いていて面倒になって作りました。
もともとはライブラリと言えるくらい大きくなる予定だったんですが、整理されていくうちにだんだんライブラリとして独立させる意味あるのか?ってサイズになってきました。でも今後拡充・・のつもりでライブラリとして公開しておきます。

なぜ Reactive Extension を使いたいのか?

ネットワークアクセスを含むリトライをこんなにシンプルに書ける環境他にあります?

IObservable<string> GetApiResultText(Func<WebRequest> webRequestFactory)
{
    return Observable.Defer(() => webRequestFactory().DownloadStringAsObservable())
        .Retry(3, TimeSpan.FromSeconds(3));
}

このメソッドはリクエストを生成するファクトリを放り込むと非同期でネットワークアクセスを行い、結果を文字列として取得し、エラーの際は3秒おきに計3回までリトライするものです。
意図即コード、僕にとってはこれがRxの一番の魅力です。
昔OptionとEitherを定義してC#で勝手if文無しバッチを書いた時もやっぱりRxの柔軟な機能が欲しくなってRxに寄せるはめになったんですよね。

また継承の多態を駆使したコードと組み合わせるとメソッドチェインによるフローの一覧性ってものすごく強力です。

そしたらもうこれはRxです、Rx。というわけでRxです。

RxFlow

シンプルなフロー制御機構です。RxのConnectableObservableと異なる形でシーケンスを分配します。

  • 複数のシーケンスから同一のシーケンスに分岐
  • 一つのシーケンスから複数のシーケンスへ分岐
  • 複数のシーケンスから複数のシーケンスへ分岐
  • 分岐から分岐へ
  • 分岐の使いまわし

のような事が簡単にできるようになります。
Rx-Mainにしか依存していないので、Rx-Mainが使える環境では使えます。ちゃんとNugetもあります。

続きを読む