いくつかのSignalR参照を更新しましたが、一般的に型指定されたハブを使用できるようにするために、状況が多少変更されましたHub<T>
。次のような既存の例とドキュメントでは、次のようになります。
次のメカニズムを介してクライアントへの参照を保持する静的クラスがあります。
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
}
強く型付けされた参照を維持することで、強く型付けされたメソッドなどを呼び出すことができます。
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>
になります。
または、以下をご覧ください。
https://github.com/Gandalis/SignalR.Client.TypedHubProxy
上記のTypeSafeClientよりも多くの機能が付属しています。
。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" };
}
}