Можно ли абстрагировать SignalR и SignalR Core для использования на одном клиенте? - PullRequest
0 голосов
/ 28 марта 2020

Я нахожусь в ситуации, когда у меня есть клиент 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.

Есть ли способ построить этот уровень абстракции и заставить его работать?

1 Ответ

0 голосов
/ 28 марта 2020

Вы используете "SignalR Core" в клиентах ". NET Core" и в клиенте ". NET Framework", вы будете использовать обычный "SignalR" ... так что вы не будете использовать их обоих в один клиент вообще, это просто не имеет смысла, так как это зависит от структуры вашего клиента.

Так что проект "WinForms" с ". NET Framework" всегда будет использовать "SignalR".

...