我一直在使用java中的pico容器为我设计的minecraft插件框架进行DI。
插件具有在接口(interface)中定义的事件监听器方法,每个接口(interface)一个方法。
如果某个特定类需要玩家加入和离开服务器时发生事件,则它会实现两个特定接口(interface);在本例中为 IPlayerLoginEvent 和 IPlayerQuitEvent。
然后,我在框架中有一个类,它将每种类型的事件接口(interface)作为构造函数注入(inject)的参数。
这个容器类被标记为@Listener,以便craftbukkit服务器软件调用它。
包装类将 craftbukkit 发送的数据与特定于框架的类进行包装,从而至少在理论上可以编写与服务器无关的插件。
小例子:
插件 AwesomePlugin 有一个 PlayerHandler 类,它实现了 IPlayerLoginEvent 和 IPlayerQuitEvent。然后,框架需要构造“PlayerLogin”和“PlayerQuit”类中每个类的实例,并将 PlayerHandler 作为构造函数参数传递。 PlayerLogin 和 PlayerQuit 实例将依次向 CraftBukkit 注册为事件监听器。
目前使用 pico 实现的方式,可以在这里看到:
https://github.com/Runsafe/Framework/blob/master/src/no/runsafe/framework/event/EventEngine.java#L32
该代码看起来确实很糟糕,我无法为这种情况找到更优雅的解决方案,所以我现在恳求您的指导:)
最佳答案
嗯,我不太明白你的问题,但我可以解释一些 pico 事件模式。
首先,事件是以容器为中心的,您不只是使用 pico 来连接事物。 每个事件使用者都被添加到容器中。每个消费者必须实现至少一个方法来获取事件对象。您可以拥有传递通用事件类的单个接口(interface),也可以拥有针对不同事件类型的多个接口(interface)。
因此,您在容器中拥有一个消费者列表(或多个事件类型的列表),您可以将消费者列表注入(inject)到某个事件广播器对象中(显然每个容器创建时都会执行一次,广播器以某种方式从某处接收事件,然后只是迭代列表并调用相关的事件处理程序方法),或者只是进行容器自定义生命周期调用(可以随时完成并触发在运行时添加的消费者,调用工作由容器本身完成)
有时您甚至可能想为每个事件创建新的事件容器,添加事件对象和所有相关的使用者。
Waffle 框架包含 pico 容器杂耍、事件处理等的最佳示例。
关于java - 使用 pico 容器设置多个装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155256/