我处于一个WinForms客户端连接到WebApi的情况,而该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);
}
但是,问题是由于无法将IHubProxy强制转换为GetHub
,因此尝试通过调用IHub
方法来获取集线器。
有没有一种方法可以构建此抽象层并使它正常工作?