2013-05-16 64 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