xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

ReactiveSignalR を ASP.NET Core SignalR に対応させました

ASP.NET SignalR 時代に作り、ASP.NET Core SignalR が出てからも長らく放置していた ReactiveSignalRASP.NET Core SignalR 向けに作り直しました!ということで、晴れて v1.0 をリリース!バージョン番号なんて特に意味はないんですが...。

ASP.NET SignalR の頃にはクライアント向けサーバー向けのライブラリを用意していたのですが、今回の ASP.NET Core SignalR 対応でサーバー側は削っています。理由はいくつかあるのですが、作ったくせに自分でも使わなかった (!) というあたりに必要性を感じなくなったというのが大きいです。

Available Now!!

すでに NuGet にも放流してあるので、今すぐ利用することができます。

PM> Install-Package ReactiveSignalR

提供する機能

現状以下のふたつだけです。超シンプル!

  • HubConnection.On メソッドを IObservable として返す
  • HubConnection にあるイベントを IObservable として返す

特に前者が大切で、Rx.NET のオペレーターにそのまま接続できるようになるのが大変強いです。

使い方

ASP.NET Core SignalR 標準だとデリゲートを使ったコールバックでしか記述できませんが、ReactiveSignalR を導入すると以下のような感じで書けるようになります。.On と書くだけで捗る!簡単!

// こんな感じでコネクションを作り
var url = "http://localhost:5000/chathub";
var connection = new HubConnectionBuilder().WithUrl(url).Build();

// Rx を使って書く
var subscription
    = connection
    .On<string>("Receive")  // ReactiveSignalR はこの部分を提供
    .Where(x => ...)  // あんなことも
    .Select(x => ...)  // こんなことも
    .ObserveOn(SynchronizationContext.Current)  // スレッドを戻すことも
    .Subscribe(x => ...);  // できます

SignalR ♡ Rx

SignalR のようなサーバー側から Push 配信されるものは Rx と非常に相性が良いです。またサーバーの負荷対策にも Rx を使うことができるので、SignalR を採用するときは Rx のことを少しだけ思い出してあげてください。

(このドキュメントは ASP.NET SignalR 時代のものですが、考え方は共通です)