【发布时间】:2021-01-07 22:33:04
【问题描述】:
我正在编写一个具有许多基于事件而不是显式调用的功能的应用程序。我已经实现了一个名为EventHost 的事件“通知程序”,它引发了某些感兴趣的事件,我希望我的应用程序中的任何功能都能够“订阅”并响应他们关心的EventHost 中的事件.下面是一些演示我所追求的伪代码:
Module Globals
Public WithEvents MyEventHost As EventHost
End Module
Class MyCoolFeature1
Shared Sub EventXHandler() Handles Globals.EventHost.EventX
' Do cool stuff...
End Sub
End Class
' And likewise for any number of new features.
问题是,正如我得到的错误所示,“Handles 子句需要在 包含类型或其基本类型之一中定义 WithEvents 变量。”
我熟悉如何以这种方式使用事件,在类本身中使用 WithEvents 字段。但是,这需要在某个时候实例化 WithEvents 字段,这只能通过在我的功能本身之外编写额外的代码,在应用程序的其他地方来完成。内部 WithEvents 字段可以显式实例化(通过类似 MyCoolFeature1.EventHost = MyEventHost 的方式),或使用类似 observer pattern 的方式,这需要向 Event Host 注册每个新功能。
我想要做的是避免这个“注册”步骤。这只是一个可能被遗忘的额外步骤,似乎没有必要。似乎像EventHost 这样的事件引发者应该可以简单地“广播”其事件,而像MyCoolFeature1 这样的事件监听器应该可以简单地“订阅”事件引发者。这样,开发人员就可以创建新功能并让他们处理他们关心的全局 EventHost 中的事件,就这样吧。
但是,由于“WithEvents 变量必须在同一个类中”的限制,这似乎是不可能的。似乎创建功能必须是一个两步过程:1. 使用“Handles”子句对功能的类和方法进行编码,2. 在我的应用程序的其他位置“注册”该功能作为EventHost 的侦听器.
有什么方法可以简单地将我的类中的方法直接订阅到外部事件引发器,而不需要额外的外部代码来“连接”到所述事件引发器?如果有必要,我会很高兴使用一些使用 .NET 的股票事件以外的东西的设计模式或技术。
【问题讨论】: