web-dev-qa-db-ja.com

SignalRで強く型付けされたハブを渡す

いくつかのSignalR参照を更新しましたが、一般的に型指定されたハブを使用できるようにするために、状況が多少変更されましたHub<T>。次のような既存の例とドキュメントでは、次のようになります。

Server-Broadcast-with-Signalr

次のメカニズムを介してクライアントへの参照を保持する静的クラスがあります。

public class StockTicker()
{
private readonly static Lazy<StockTicker> _instance = new Lazy<StockTicker>(
            () => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients));

 IHubConnectionContext Clients {get;set;}

 private StockTicker(IHubConnectionContext clients)
        {
            Clients = clients;
        }
}

したがって、静的参照がチェックされ、nullの場合は次のようになります。

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients

インスタンスを作成し、コンストラクターを介してクライアントに提供します。

つまり、これは以前の動作方法であり、実際、上記のURLにはこのようになっています。しかし今はHub<T>コンストラクターに必要なわずかな変更があります:

 private StockTicker(IHubConnectionContext<dynamic> clients)
 {
   Clients = clients;
 }

ここで私の質問は、これをさらに拡張して、私のバージョンのStockTickerがタイプxのクライアントに対して強く型付けされたプロパティを持つことができるようにする方法です。

 IHubConnectionContext<StockTickerHub> Clients {get;set;}

 private StockTicker(IHubConnectionContext<dynamic> clients)
 {
   Clients = clients; // Fails, wont compile
 }

強く型付けされた参照を維持することで、強く型付けされたメソッドなどを呼び出すことができます。

12
rism

2つの汎用パラメーターを受け取るGetHubContextの新しいオーバーロードがあります。 1つ目は以前と同様のハブタイプですが、2つ目の汎用パラメーターはTClient(Hub<T>のT)です。

StockTickerHubが次のように定義されていると仮定します。

public class TypedDemoHub : Hub<IClient>

次に

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients

になります

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub, IClient>().Clients

新しいオーバーロードによってGetHubContextに返されるタイプはIHubContext<IClient>であり、ClientsプロパティはIHubConnectionContext<IClient>またはIHubConnectionContext<dynamic>ではなくIHubConnectionContext<StockTickerHub>になります。

27
halter73

または、以下をご覧ください。

https://github.com/Gandalis/SignalR.Client.TypedHubProxy

上記のTypeSafeClientよりも多くの機能が付属しています。

2
Edward

。NET Core Web Appでは強く型付けされたsignalRハブコンテキストを挿入このように

public interface IClient
{
    Task ReceiveMessage(string message);
}

public class DevicesHub : Hub<IClient>
{
}

public class HomeController : ControllerBase
{
    private readonly IHubContext<DevicesHub, IClient> _devicesHub;

    public HomeController(IHubContext<DevicesHub, IClient> devicesHub)
    {
        _devicesHub = devicesHub;
    }       

    [HttpGet]
    public IEnumerable<string> Get()
    {
       _devicesHub.Clients
          .All
          .ReceiveMessage("Message from devices.");

       return new string[] { "value1", "value2" };
    }
}
1
Stefan Varga

を見てみましょう:

https://github.com/i-e-b/SignalR-TypeSafeClient

役に立つかもしれません!

0
purplesoft