1

我一直在使用 java 中的 pico 容器为我设计的 minecraft 插件框架做 DI。

插件具有在接口中定义的事件侦听器方法,每个接口一个方法。

如果一个特定的类在玩家加入和离开服务器时想要事件,它实现了两个特定的接口;在这种情况下 IPlayerLoginEvent 和 IPlayerQuitEvent。

然后我在框架中有一个类,它将每种类型的事件接口作为构造函数注入的参数。

这个容器类被标记为@Listener 以便craftbukkit 服务器软件调用它。

包装类使用特定于框架的类包装craftbukkit 发送的数据,至少在理论上,可以编写与服务器无关的插件。

小例子:

插件 AwesomePlugin 有一个实现 IPlayerLoginEvent 和 IPlayerQuitEvent 的 PlayerHandler 类。然后,框架需要构造每个类“PlayerLogin”和“PlayerQuit”的实例,将 PlayerHandler 作为构造函数参数传入。PlayerLogin 和 PlayerQuit 实例将依次向 CraftBukkit 注册为事件侦听器。

目前使用 pico 实现的方式可以在这里看到:

https://github.com/Runsafe/Framework/blob/master/src/no/runsafe/framework/event/EventEngine.java#L32

该代码确实看起来很糟糕,我无法为这种情况找到更优雅的解决方案,所以我现在恳求您的指导:)

4

1 回答 1

2

好吧,我不太明白你的问题,但我可以解释一些 pico 事件模式。

首先,事件是以容器为中心的,你不会仅仅使用 pico 来连接事情。每个事件消费者都被添加到容器中。每个消费者必须实现至少一种方法来获取事件 obj。您可以有一个带有通用事件类传递的接口,也可以有多个用于不同事件类型的接口。

因此,您在容器中有一个消费者列表(或多个事件类型的多个列表)您可以将消费者列表注入某个事件广播器对象(显然每次创建容器时完成一次,广播器以某种方式从某处接收事件,然后只需遍历列表并调用相关的事件处理程序方法)或只是进行容器自定义生命周期调用(可以随时完成并触发运行时添加的消费者,调用工作由容器自己完成)

有时您甚至可能希望为每个事件创建新的事件容器,添加事件 obj 和所有相关的消费者。

Waffle 框架包含 pico 容器杂耍、事件处理等的最佳示例。

于 2012-10-31T19:10:48.923 回答