在 SignalR Hub 中引用另一个 project/winform

Give a reference to another project/winform in SignalR Hub

我正在研究 SignalR For Winforms 官方示例。他们处理 UI 交互的方式是使用 Program instance/reference,您可以在下面的代码中看到:

public class MyHub : Hub
{
    public void Send(string name, string message)
    {
        Clients.All.addMessage(name, message);
    }
    public override Task OnConnected()
    {
        //here they used Program....
        Program.MainForm.WriteToConsole("Client connected: " + Context.ConnectionId);
        return base.OnConnected();
    }
    public override Task OnDisconnected(bool graceFull)
    {
        Program.MainForm.WriteToConsole("Client disconnected: " + Context.ConnectionId);
        return base.OnDisconnected(graceFull);
    }
}

我的问题是,我在 Visual Studio 中创建了一个空解决方案并添加了 2 个项目,一个是 WinForms 项目,另一个是 class 库。

显然,我无法在 MyHub class 中的 WinForms 项目中提供 Program 参考,该项目位于 class 库项目中,因为据我所知HubMyHub class 不应实例化...它只是为了反射而存在。

有没有一种方法可以将我的 winforms 的引用静态地传递给 MyHub class?

好的,我只是通过添加一个静态字段(一个由 Form:

实现的接口来解决
public class MyHub : Hub
{
    public static ICommunicationOwner Owner;

    public void Send(string name, string message)
    {
        Clients.All.addMessage(name, message);
    }
    public override Task OnConnected()
    {
        Owner.GetData("Client connected: ", Context.ConnectionId);
        return base.OnConnected();
    }
    public override Task OnDisconnected(bool graceFull)
    {
        Owner.GetData("Client disconnected: ", Context.ConnectionId);
        return base.OnDisconnected(graceFull);
    }
}

在服务器中 class 我是这样的:

    public void StartServer()
    {
        MyHub.Owner = _owner;
        try
        {
            SignalR = WebApp.Start(_serverUri);
        }
        catch (TargetInvocationException e)
        {
            _isServerStarted = false;
            _owner.GetData("Connection", "Error starting server: " + e.Message);
            return;
        }
        catch (Exception e)
        {
            _isServerStarted = false;
            _owner.GetData("Connection", "Error starting server: " + e.Message);
            return;
        }

        _owner.GetData("Connection", "Successful");
        _isServerStarted = true;
    }

或者我强烈推荐使用 SignalR Self-Host.This 机制,这对你很有帮助。这是一个循序渐进的教程:

Self-Host

这个机制是这样工作的:你正在创建一个信号主机,它就像将数据推送到特定端口。这个主机可以是控制台应用程序,asp.net mvc 应用程序或 winform 等。然后其他项目或 class 库将是客户端(Signalr 有包 'SignalR Javascript Client' 和 'SignalR .NET Client') . Web 应用程序将消息作为 javascript 客户端,其他应用程序(如 winforms 或控制台)将消息作为 .net 客户端。这种机制是真正可伸缩和可扩展的。