在SignalR Hub中引用另一个项目/ winform

时间:2015-02-22 20:29:53

标签: c# .net winforms signalr signalr-hub

我正在研究SignalR For Winforms官方示例。他们处理UI交互的方式是使用Program实例/引用,如下面的代码所示:

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项目,另一个是类库。

显然我不能在类库项目中的Program类中给出WinForms项目的MyHub引用,因为据我所知Hub或{{1} } class不应该被实例化......它只是为了反射而存在。

有没有办法可以静态地将对winforms的引用传递给MyHub类?

2 个答案:

答案 0 :(得分:0)

好的,我刚刚通过添加一个静态字段(由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);
    }
}

在服务器类中,我确实喜欢这样:

    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;
    }

答案 1 :(得分:0)

或者我强烈推荐使用SignalR Self-Host。这个机制对你很有帮助。这是一步一步的教程:

Self-Host

这种机制的工作原理如下:您正在创建一个信号器主机,就像将数据推送到特定端口一样。这个主机可以是控制台应用程序,asp.net mvc应用程序或winform等。然后其他项目或类库将是客户端(Signalr包含' SignalR Javascript客户端'和SignalR .NET客户端&# 39) 。 Web应用程序将消息作为javascript客户端,其他应用程序(如winforms或控制台)将以.net客户端的形式接收消息。这种机制是一种真正可扩展和可扩展的机制。