Я нахожусь в ситуации, когда у меня есть клиент WinForms, который подключается к WebApi, и у этого WebApi есть SignalR. В настоящее время разрабатывается версия WebApi ASP. Net Core, в которой используется SignalR Core. На данном этапе разработки клиент не может перейти непосредственно к использованию только SignalR Core, поэтому ему необходимо поддерживать обе версии.
Единственная пара методов-хаб-прокси, которые используются повсеместно, - это On<T>
и * 1004. *.
Итак, идея состояла в том, чтобы создать слой абстракции, поэтому я создал такой класс:
public class ClassicService : IHubService
{
private HubConnection hubConnection;
private Dictionary<HubType, IHubProxy> hubs;
public IHubService Build(string token)
{
hubConnection = new HubConnection("serverurl");
hubs = new Dictionary<HubType, IHubProxy>() {
{ HubType.Notification, hubConnection.CreateHubProxy("NotificationHub")
};
return this;
}
public IHubService Start()
{
hubConnection.Start().Wait();
return this;
}
public IHub GetHub(HubType hubType)
{
return hubs[hubType];
}
}
И интерфейс IHub
выглядит следующим образом:
public interface IHub
{
Task Invoke(string method, params object[] args);
IDisposable On(string eventName, Action onData);
IDisposable On<T>(string eventName, Action<T> onData);
}
Однако проблема заключается в попытке получить концентратор путем вызова метода GetHub
, поскольку IHubProxy не может быть приведен к IHub
.
Есть ли способ построить этот уровень абстракции и заставить его работать?