Подписаться на событие из объекта, созданного во время выполнения - PullRequest
2 голосов
/ 09 апреля 2019

У меня есть класс Server, который создает объект ClientHandler во время выполнения при получении нового соединения.Внутри ClientHandler мне нужно запустить clientEvent при получении конкретных сообщений.В моем классе Form есть ссылка на класс Server, но мне нужно подписаться на clientEvent в объекте ClientHandler.Тем не менее, объект еще не существует во время проектирования.Как я могу сделать подписку?

Я создал обработчик событий на сервере, который подписывается на clientEvent, и он вызывает другое serverEvent.В классе Form я подписываюсь на serverEvent.Таким образом, я слушаю clientEvent косвенно.Но я верю, что есть лучший способ сделать это.

public delegate void SomeEvent(string message);

public class Server
{
  public ClientHandler clientHandler;
  public event SomeEvent serverEvent;
  // callback function when new connection received
  public void on_connected()
  {
    clientHandler = new ClientHandler(...)
    clientHandler.clientEvent += ClientEventHandler;
    }
  public void ClientEventHandler(string message)
  {
    serverEvent?.Invoke(message)
  }
}

public class ClientHandler
{
  public event SomeEvent clientEvent;
  // callback when message is read
  void ReadCallback(...)
  {
    ...
    // Some message received
    clientEvent?.Invoke("Message received: " + someMessage);
  }

public partial class From1 : Form
{
  public Form1()
  {
   Server server = new Server(...);
   server.serverEvent += serverEventHandler;
   ...
  }
  private void serverEventHandler(string message)
  {
   // do something with message
  }
}

1 Ответ

1 голос
/ 09 апреля 2019

В этом подходе нет ничего плохого, если вы обязательно отмените подписку на событие, когда вы удаляете своего ребенка.

Вот 3 основных подхода к этой проблеме

  1. Родитель подписывается на событие child , Отказ от подписки при удалении child
  2. Передача ссылки из parent в child , вызов события для parent при необходимости,Это может быть немного аккуратнее (иногда) и более управляемым.
  3. Использование Отделенного обмена сообщениями через что-то вроде Агрегатор событий , который будет перенаправлять события от издателя на абонент .Они разъединены , потому что им не нужно знать друг о друге и они могут пропустить всех родителей вместе
...