2013-01-18 49 views
0

我想爲所有的子類實現一個共同的提供者,想象一些模式: SuperComponent.classComponentA.classComponentB.class的父代。 我有供應商:有使用Guice的子類的共同提供者嗎?

@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; 
} 

的想法是需要的對象在另一個類的構造函數List<ComponentA>和/或List<ComponentB>時調用此提供商。 想象一下這樣的:

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. 

我怎樣才能使它發揮作用?我知道我可以爲List<ComponentA>List <ComponentB>中的每一個創建不同的提供者,但我需要它,因爲在實際中,組件的數量遠遠大於2 ...

+0

謝謝傑夫的回答! –

回答

0

我不認爲有一個很好的內置函數,在處理這種方式 - Guice可以綁定很多,或檢查和操作其綁定,但沒有良好的接口來創建元級綁定。你有幾個選擇,但:

  1. 離開該列表,構建消費者,通過供應商:

    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); 
    } 
    
  2. 列出你需要綁定這樣的類並創建提供商在configure方法:

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

    這使用getProvider,檢索類型化Provider噸一個非常方便的方法帽子會在創建Injector後立即生效(但不會在此之前)。

  3. 編寫一個模塊,使用Guice SPI迭代模塊中的每個綁定,完成上述操作之一。

希望幫助!

相關問題