2013-05-16 90 views
0

如果我有一个接口IBaseFunction和这个接口的多个实现。 我如何可以遍历绑定拜访每一个方法,即Guice遍历多个绑定

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 

bind(IBaseFunction.class).annotatedWith(ExDelete.class).to(ExDeleteFunction.class); 
bind(IBaseFunction.class).annotatedWith(ExAdd.class).to(ExAddFunction.class); 
... 

    } 
} 

我需要在每个绑定调用一个函数“发布()(使总线上可用的处理器)

我可以打电话在每个单独的功能结合这样的: -

ExDeleteFunction functionExDelete = injector.getInstance(ExDeleteFunction.class); 
ExDeleteFunction.publish(); 
ExAddFunction functionExAdd = injector.getInstance(ExAddFunction.class); 
ExAddFunction.publish(); 

不过,我想需要做的就是遍历这些,并呼吁所有的人的“发布”的功能是什么,有没有这样做的一种方式? 也许使用injector.getAllBindings()?像这样的东西: -

Injector injector = Guice.createInjector(new ServicesModule()); 

    Map<Key<?>, Binding<?>> bindings = injector.getAllBindings(); 
    for (Binding<?> binding : bindings.values()) { 
     Key<?> key = binding.getKey(); 
...?? 

还是有一个更简单的方法?

回答

2

是的,有更简单的方法,称为Multibindings。有了这个,你就可以做这样的事情

public class BaseFunctionsModule extends AbstractModule { 
    @Override 
    public void configure() { 
     Multibinder<BaseFunction> multibinder = Multibinder.newSetBinder(binder(), BaseFunction.class); 
     mapBinder.addBinding().to(ExDeleteFunction.class); 
     mapBinder.addBinding().to(ExAddFunction.class); 
     // others 
    } 
} 

public static void main(String[] args) { 
    Injector injector = Guice.createInjector(new BaseFunctionsModule()); 
    Set<BaseFunction> functions = injector.getInstance(new TypeLiteral<Set<BaseFunction>>() {}); 
    for (BaseFunction function : functions) { 
     function.publish(); 
    } 
} 

然而,这种方式可能无法单独注入你的功能(我不知道,你需要对其进行测试);你也可以看看MapBinder