我需要在域模型中实现发布/订阅系统。我正在考虑使用 Guava 的 EventBus,但我想使用接口和适配器来让我的域模型不了解这样的实现细节。不幸的是,EventBus 对订阅注解的使用让这个想法很不爽。
有什么方法可以在不使用 @Subscribe 注释的情况下订阅处理程序?查看文档,似乎没有,但也许有些东西我没有看到。
谢谢!
Guava 团队成员在这里。
你只能订阅一个带有@Subscribe
注解的处理程序是很刻意的——EventBus
旨在替换接口、适配器等,而不是补充它们——但是为什么你说它会暴露更多的实现细节呢?根据我们的经验,它通常会暴露较少的细节。
一种解决方法是调整 Handler。就像是:
class GuavaHandler<T extends Message> implements Handler<T> {
private Handler<T> handler;
public GuavaHandler(Handler<T> handler) {
this.handler = handler;
}
@Override
@Subscribe
public void handle(T message) {
try {
handler.getClass().getMethod("handle", message.getClass());
handler.handle(message);
} catch (NoSuchMethodException ignored) {
// workaround
}
}
}
您只需在此特定实现中定义属性。