如何将单个接口绑定到Guice中的多个类?

时间:2015-07-27 08:27:49

标签: java dependency-injection guice

想要将单个接口绑定到Eg的多个类。

bind(interface1.class).to(classAbc.class);
bind(interface1.class).to(classDef.class);
bind(interface1.class).to(classGhi.class);

试过这个,但似乎没有起作用:

baseClass obj1;

obj1.add(new classAbc);
obj2.add(new classDef);

bind(interface1.class).toInstance(obj1);

2 个答案:

答案 0 :(得分:2)

你看一下Multibinder吗? 这是直接来自API

的示例
 public class SnacksModule extends AbstractModule {
   protected void configure() {
     Multibinder<Snack> multibinder
         = Multibinder.newSetBinder(binder(), Snack.class);
     multibinder.addBinding().toInstance(new Twix());
     multibinder.addBinding().toProvider(SnickersProvider.class);
     multibinder.addBinding().to(Skittles.class);
   }
 }

答案 1 :(得分:1)

如果你想做这样的事情:

baseClass obj1;

obj1.add(new classAbc);
obj2.add(new classDef);

bind(interface1.class).toInstance(obj1);

您可以,但前提是您的baseClass属于复合模式(其中对象也可以充当其他对象的容器)。否则,您需要在另一个容器中提供替代方案,例如List:

List<Interface1> interfaceList = new ArrayList<>();

interfaceList.add(new classAbc());
interfaceList.add(new classDef());

bind(new TypeLiteral<List<Interface1>>() {}).toInstance(interfaceList);

虽然有上述解决方案:

  1. 它不会接受实现者classAbcclassDef等的依赖关系。
  2. 无论是否需要,它都会先发制人地创建所有这些依赖项。
  3. 该列表是可变的,因此其他人可以影响永久保存的列表。
  4. 相反,Multibinding的手动模拟可能看起来像[未经测试]:

    public class YourModule extends AbstractModule {
      @Override public void configure() {}
    
      @Provides Set<Interface1> createSet(ClassAbc abc, ClassDef def) {
        return ImmutableSet.of(abc, def);
      }
    
      // Provider<ClassAbc> can't usually be cast to Provider<Interface1>
      @SuppressWarnings 
      @Provides Set<Provider<Interface1>> createProviderSet(
          Provider<ClassAbc> abc, Provider<ClassDef> def) {
        return ImmutableSet.of(
            (Provider<Interface1>) abc,
            (Provider<Interface1>) def);
      }
    }