我一直在使用java中的pico容器为我设计的Minecraft插件框架做DI。
插件具有在接口中定义的事件侦听器方法,每个接口一个方法。
如果特定类在玩家加入和离开服务器时想要事件,它会实现两个特定的接口;在本例中为IPlayerLoginEvent和IPlayerQuitEvent。
然后我在框架中有一个类,它将每种类型的事件接口作为构造函数注入参数。
此容器类用@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
该代码确实看起来很糟糕,我无法为这种情况找到更优雅的解决方案,所以我现在请求您的指导:)
答案 0 :(得分:1)
嗯,我不太明白你的问题,但我可以解释一些微微的事件模式。
首先,事件是以容器为中心的,你不要只使用微微来连接事物。 每个事件使用者都被添加到容器中。每个消费者必须实现至少一种方法来获取事件obj。您可以使用传递通用Event类的单个接口,也可以为不同的事件类型提供许多接口。
因此,您有一个容器中的消费者列表(或几个事件类型的几个列表)您可以将消费者列表注入某个事件广播器对象(显然每个容器创建一次,广播公司接收事件从某个地方,然后只是遍历列表并调用相关的事件处理程序方法)或只是进行容器自定义生命周期调用(可以随时执行并触发消费者在运行时添加,调用作业由容器本身完成)
有时你甚至可能想为每个事件创建新的事件容器,添加事件obj和所有相关的消费者。
Waffle框架包含最好的pico容器杂耍,事件处理等示例。