在Guice中使用Mapbinder在模块中使用Inject

时间:2015-11-27 09:50:20

标签: java dependency-injection guice

我正在使用Guice MapBinder将接口的不同实现绑定到特定键。问题是,我需要在这些绑定中注入一些依赖项。我不认为这是可能的,因为我需要通过这样做来初始化模块:

Guice.createInjector(new SomeModule());

有可能吗?

编辑:更完整的例子:

界面:

public interface SomeInterface {
  String getName();
}

实现:

public class SomeImplementation imlements SomeInterface{
   @Inject
   public SomeImplementation(SomeDependency someDep){
       //this needs to be injected
   }

   @Override
   public String getName(){
      //getNameFromDependency
   }
}

模块:

public class SomeModule extends AbstractModule {

 @Override
 protected void configure() {
   MapBinder<String, SecureToken> binder = MapBinder.newMapBinder(binder(), String.class, SomeInterface.class);

    //bind stuff
   }
}

EDIT2: 问题是,我使用Reflection来获取接口的所有实现。要调用方法“getName”,我需要调用newInstance。这似乎是问题......: - /

protected void configure() {
    MapBinder<String, SomeInterface> binder = MapBinder.newMapBinder(binder(), String.class, SecureToken.class);
    try {
      Set<Class<? extends SomeInterface>> subTypes = reflections.getSubTypesOf(SecureToken.class);
      for (Class<? extends SecureToken> clazz : subTypes) {
        SomeInterface someInterface = clazz.newInstance();
        String name = someInterface.getName();
        binder.addBinding(name).toInstance(someInterface);
      }
    } catch (IllegalAccessException | InstantiationException e) {
      e.printStackTrace();
    }
  }

1 个答案:

答案 0 :(得分:2)

你不再“绑定”,你有(IMO)工厂。所以你应该这样暴露它。 注意:您可以注入喷射器(对于工厂而言)是一件非常好的事情。