Dependency injection 是否有一个使用Guice的子类公共提供程序?

Dependency injection 是否有一个使用Guice的子类公共提供程序?,dependency-injection,guice,Dependency Injection,Guice,我试图为所有子类实现一个公共提供程序,想象一下一些模式: SuperComponent.class是ComponentA.class和ComponentB.class的父级。 我的供应商: @Provides <T extends SuperComponent> List<T> providesComponents(Provider<T> provider) { List<T> componentList = new ArrayLi

我试图为所有子类实现一个公共提供程序,想象一下一些模式: SuperComponent.class是ComponentA.class和ComponentB.class的父级。 我的供应商:

    @Provides
<T extends SuperComponent> List<T> providesComponents(Provider<T> provider) {
    List<T> componentList = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
        componentList.add(provider.get());
    }
    return componentList;
}
其思想是在需要对象列表和/或其他类的构造函数中的列表时调用此提供程序。 想象一下:

public class ResourceManager {

List<ComponentA> componentAList;
List<ComponentB> componentBList;    

@Inject
public ResourceManager(List<ComponentA> componentAList, List<ComponentB> componentBList) {
    this.componentAList = componentAList;
            this.componentBList = componentBList;
}
我得到一个错误,说:

1) com.google.inject.Provider<T> cannot be used as a key; It is not fully specified.

我怎样才能让它工作?我知道我可以为每个列表和列表创建不同的提供者,但我需要它,因为在现实中,组件的数量远远大于2…

我不认为有一种好的内置方式来处理这个Guice,它可以绑定很多,或者检查和操作它的绑定,但是没有良好的接口来创建元级绑定。不过,您确实有一些选择:

通过提供商将列表留给消费者:

public static <T> List<T> createList(Provider<T> provider) {
  List<T> list = new ArrayList<T>();
  for (int i = 0; i < 5; i++) {
    list.add(provider.get());
  }
  return list;
}

@Inject MyConsumer(Provider<Foo> depProvider) {
  List<Foo> myFoos = createList(depProvider);
}
这使用了一个非常方便的方法,该方法检索一个类型化的提供程序,该提供程序将在创建注入器后立即工作,而不是在创建注入器之前

编写一个模块,通过使用遍历模块中的每个绑定来执行上述操作之一


希望有帮助

谢谢杰夫的回答!
public class MyModule extends AbstractModule {
  public void configure() {
    List<Class<?>> classList = Lists.newArrayList(Class1.class, Class2.class);
    for (Class<?> clazz : classList) {
      bind(listOf(clazz)).toProvider(new ComponentListProvider<?>(getProvider(clazz)));
    }
  }

  private static <T> Key<List<T>> listOf(Class<T> clazz) {
    return new Key<List<T>>() {};
  }

  private static class ComponentListProvider<T> implements Provider<List<T>>() {
    private final Provider<T> wrappedProvider;

    ComponentListProvider(Provider<T> wrappedProvider) {
      this.wrappedProvider = wrappedProvider;
    }

    @Override public List<T> get() {
      return createList(wrappedProvider);
    }
  }
}