首页 > 解决方案 > 是否可以抽象 SignalR 和 SignalR Core 以在一个客户端上使用?

问题描述

我的情况是,我有一个连接到 WebApi 的 WinForms 客户端,而这个 WebApi 有 SignalR。现在,正在开发 WebApi 的 ASP.Net Core 版本,它使用 SignalR Core。在这个开发阶段,客户端不能直接使用 SignalR Core,因此需要同时支持这两个版本。

在整个过程中使用的唯一几个集线器代理方法是On<T>Invoke

所以想法是创建一个抽象层,所以我创建了这样一个类:

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.

有没有办法构建这个抽象层并让它工作?

标签: c#asp.net-coresignalrasp.net-core-signalr

解决方案


您在“.NET Core”客户端中使用“SignalR Core”,在“.NET Framework”客户端中使用普通的“SignalR”......所以你根本不会在一个客户端中同时使用它们,它只是没有意义,因为它取决于您客户的框架。

因此,带有“.NET Framework”的“WinForms”项目将始终使用“SignalR”。


推荐阅读