2015-02-22 1 views
0

Я работаю над официальным примером SignalR For Winforms. Образом они обрабатывают взаимодействие пользовательского интерфейса с использованием Program экземпляра/ссылки, как вы можете видеть в коде ниже:Дайте ссылку на другой проект/winform в концентраторе SignalR

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 или MyHub класс не должен быть создан ... его только там ради отражения.

Есть ли способ, которым я могу передать ссылку на мои winforms классу MyHub либо статически, либо что-то еще?

ответ

0

Ok я просто решена путем добавления статического поля (интерфейс, который реализуется с помощью 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; 
    } 
0

В качестве альтернативы моя сильно рекомендация является использование SignalR Self-Host.Этот механизм очень полезен для вас. Это пошаговое руководство:

Self-Host

Этот механизм работает следующим образом: вы создаете хост signalr, который как push-данные для конкретного порта. Этот хост может быть консольным приложением, приложением asp.net mvc или winform и т. Д. Тогда другой проект или библиотека классов будет клиентом (Signalr имеет пакеты как «SignalR Javascript Client» и «SignalR .NET Client») . Веб-приложение будет принимать сообщение как клиент javascript, другое приложение, такое как winforms или console, примет сообщение как .net-клиент. Этот механизм является действительно масштабируемым и расширяемым.