java - 使用 pico 容器设置多个装饰器

标签 java dependency-injection adornerdecorator picocontainer

我一直在使用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/

相关文章:

java - 您可以在您执行 acquire() 的不同线程上调用 java.util.concurrent.Semaphore.release() 吗?

java - 无法在我的自定义 ListView 中实现搜索 View

java - 无法从 REST API 获取 JSON 作为字符串

Spring中基于Java的依赖注入(inject)

c# - 内部有两个服务和依赖注入(inject)的外观 - 设计模式方法

java - 是否可以仅更改 TextView 的一部分?

c# - Rhino.Mocks : method calls recorder (a. k.a.测试 spy )

带有验证的 WPF 文本框丢失 ErrorTemplate

wpf - Scrollviewer中的错误顾问