我一直在使用 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
该代码确实看起来很糟糕,我无法为这种情况找到更优雅的解决方案,所以我现在恳求您的指导:)