从运行时创建的对象订阅事件

阿卡斯

我有一个Server类,该类在运行时在接收到新连接时创建ClientHandler对象。在ClientHandler内部,我需要在收到特定消息时触发一个clientEvent。在我的Form类中,我对Server类有一个引用,但是我需要在ClientHandler对象中订阅clientEvent。但是,该对象在设计时尚不存在。我该如何订阅?

我在Server中创建了一个订阅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
  }
}

一般

只要您确定在删除孩子时取消订阅该事件,这种方法就没有问题。

这是解决此问题的3种主要方法

  1. 家长订阅事件中的孩子退订孩子被移除
  2. 父级引用传递child在需要时父级调用事件这可能会更整洁(有时)并且更易于管理。
  3. 通过事件聚合器(Event Aggregator)之类的方法使用去耦消息传递,它将事件发布转发订阅者他们之所以脱钩是因为他们不需要彼此了解,可以一起跳过父母

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章