簡體   English   中英

Guice迭代多個綁定

[英]Guice iterating over multiple bindings

如果我有一個接口IBaseFunction和這個接口的多個實現。 我如何迭代調用每個ie上的方法的綁定

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);
...

  }
}

我需要在每個綁定上調用一個函數'publish()(使得處理程序在總線上可用)

我可以像這樣單獨調用每個綁定上的函數: -

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

然而,我想要做的是迭代這些並在所有這些上調用'publish'函數,有沒有辦法做到這一點? 也許使用injector.getAllBindings()? 像這樣: -

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

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

還是有更簡單的方法?

是的,有更簡單的方法,稱為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM