在 Java 中使用 MapBinder 提供多个绑定
Provide multiple bindings using MapBinder in Java
我正在使用 Google 的 MapBinders 将事件侦听器(我自己的自定义接口)映射到 EventType。
MapBinder<EventType, EventListener> eventEventHandlerMapBinder =
MapBinder.newMapBinder(binder(), EventType.class, EventListener.class);
eventEventHandlerMapBinder
.addBinding(EventType.DUMMY_EVENT)
.to(DummyListener.class);
这让我可以将 Map<EventType, Provider<EventListener>> eventEventHandlerMapBinder
注入到我的 EventRegistry 或任何地方。
我现在想将多个 EventListeners 映射到一个事件类型,即对于 DUMMY_EVENT,我希望绑定 DummyListener.class 和另一个 DummyListener.class。我怎么做?
我不能这样做,因为 MapBinder 为 V:
创建了一个 Provider
MapBinder<EventType, List> eventEventHandlerMapBinder2 =
MapBinder.newMapBinder(binder(), EventType.class, List.class);
eventEventHandlerMapBinder2
.addBinding(EventType.DUMMY_EVENT)
.to((Key<? extends List>) Arrays.asList(DummyListener.class, AnotherDummyListener.class));
您可以使用 MapBinder
和 Multibinder
的组合(但您需要从 List
切换到 Set
,但我想这不应该一个问题)。
这是一个简单的工作示例:
interface Service {
}
static class Service1 implements Service {
}
static class Service2 implements Service {
}
public static void main(String[] args) {
var injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
var multibinder = Multibinder.newSetBinder(binder(), Service.class);
multibinder.addBinding().to(Service1.class);
multibinder.addBinding().to(Service2.class);
var mapBinder = MapBinder.newMapBinder(binder(), new TypeLiteral<String>() {}, new TypeLiteral<Set<Service>>() {});
mapBinder.addBinding("foo").to(Key.get(new TypeLiteral<Set<Service>>(){}));
}
});
var map = injector.getInstance(Key.get(new TypeLiteral<Map<String, Set<Service>>>() {
}));
assert map.get("foo") != null;
}
为了区分不同的Set
,您可以使用注释,例如@Named
/Names
或使用自定义的。
我正在使用 Google 的 MapBinders 将事件侦听器(我自己的自定义接口)映射到 EventType。
MapBinder<EventType, EventListener> eventEventHandlerMapBinder =
MapBinder.newMapBinder(binder(), EventType.class, EventListener.class);
eventEventHandlerMapBinder
.addBinding(EventType.DUMMY_EVENT)
.to(DummyListener.class);
这让我可以将 Map<EventType, Provider<EventListener>> eventEventHandlerMapBinder
注入到我的 EventRegistry 或任何地方。
我现在想将多个 EventListeners 映射到一个事件类型,即对于 DUMMY_EVENT,我希望绑定 DummyListener.class 和另一个 DummyListener.class。我怎么做?
我不能这样做,因为 MapBinder 为 V:
MapBinder<EventType, List> eventEventHandlerMapBinder2 =
MapBinder.newMapBinder(binder(), EventType.class, List.class);
eventEventHandlerMapBinder2
.addBinding(EventType.DUMMY_EVENT)
.to((Key<? extends List>) Arrays.asList(DummyListener.class, AnotherDummyListener.class));
您可以使用 MapBinder
和 Multibinder
的组合(但您需要从 List
切换到 Set
,但我想这不应该一个问题)。
这是一个简单的工作示例:
interface Service {
}
static class Service1 implements Service {
}
static class Service2 implements Service {
}
public static void main(String[] args) {
var injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
var multibinder = Multibinder.newSetBinder(binder(), Service.class);
multibinder.addBinding().to(Service1.class);
multibinder.addBinding().to(Service2.class);
var mapBinder = MapBinder.newMapBinder(binder(), new TypeLiteral<String>() {}, new TypeLiteral<Set<Service>>() {});
mapBinder.addBinding("foo").to(Key.get(new TypeLiteral<Set<Service>>(){}));
}
});
var map = injector.getInstance(Key.get(new TypeLiteral<Map<String, Set<Service>>>() {
}));
assert map.get("foo") != null;
}
为了区分不同的Set
,您可以使用注释,例如@Named
/Names
或使用自定义的。