【问题标题】:Setting up multiple decorators with pico container使用 pico 容器设置多个装饰器
【发布时间】:2012-10-31 09:53:28
【问题描述】:

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

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

【问题讨论】:

  • 我建议在您的架构上添加更多信息;如果不深入研究您的代码,就很难了解正在发生的事情。

标签: java dependency-injection adornerdecorator picocontainer


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 稍后我会更深入地阅读您的答案,因为我没有立即关注,但现在,这里有一些附加信息:CraftBukkit 服务器有一个我调用的方法来注册事件侦听器。这些需要使用@EventHandler 进行标记,并具有一些将特定事件类型作为其参数的方法。我不想在不会使用的插件中创建事件侦听器,因此我编写了映射代码,它创建了所需的侦听器。我明天会回到这个线程,现在我需要睡眠..跨度>
  • 好吧,我想了一会儿,我想我明白你在说什么,这听起来像是一个很好的系统。不幸的是,它不能完全解决我的情况。出于性能原因,我不希望为框架编写的每个插件都监听所有服务器事件。如果有某种方法可以注册实现一个接口的多个组件,然后获取该接口的所有实现的实例,而忽略缺少依赖项的那些,那将很好地解决我的问题..
  • “缺少部门”是什么意思?您可以使用不同的接口拆分事件流,或者只使用不同的方法而不使用任何接口(基于反射的生命周期、pico 功能),或者您可以为事件侦听器提供单个空标记接口,然后使用您自己的基于反射的查找传递事件。实际上有很多选择。
  • 我的意思是,如果我注册了一个将某些东西作为构造函数参数的类,但是我没有注册实现该依赖项的东西,我不希望 pico tro 尝试初始化该类.. 它做不到那.. 我的类上有自定义事件接口,但我需要 bukkit 事件处理程序来路由事件。但是,我不想监听比需要更多的事件。
  • 感谢您的意见,多亏了它,我现在找到了更好的策略。代码仍在 github 上供任何好奇的人使用。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 2012-06-20
  • 2021-01-07
  • 2013-06-15
相关资源
最近更新 更多