2017-10-05 210 views
0

我正在使用Guice作爲DI。我想創建一個通用類的動態綁定,以取代我現在創建的手動綁定。Guice - 以編程方式創建的綁定

手動方式是工作的罰款,到目前爲止:

 bind(new TypeLiteral<DAOService<SourceSystem, UUID>>() {}) 
      .to(new TypeLiteral<DAOServiceImpl<SourceSystem, UUID>>() {}); 

但我想是這樣的:

final String poPackage = PersistableObject.class.getPackage().getName(); 
    final Reflections r = new Reflections(poPackage); 
    final Class<DAOService> ifClass = DAOService.class; 
    final Class<DAOServiceImpl> implClass = DAOServiceImpl.class; 

    for (Class<? extends PersistableObject> dbClass : r.getSubTypesOf(PersistableObject.class)) { 
     final ParameterizedType ifPt = Types.newParameterizedType(ifClass, dbClass, UUID.class); 
     final ParameterizedType implPt = Types.newParameterizedType(implClass, dbClass, UUID.class); 

     final TypeLiteral<?> fromLiteral = TypeLiteral.get(ifPt); 
     final TypeLiteral<?> toLiteral = TypeLiteral.get(implPt); 

     bind(fromLiteral).to(toLiteral); // not compiling! 
    } 

這並不編譯,因爲:

[50,30] no suitable method found for to(com.google.inject.TypeLiteral<capture#1 of ?>) 

有用動態創建的TypeLiterals以編程方式在Guice中創建綁定的可能性?

+0

爲什麼你想要「動態」呢? –

+1

你知道這是安全的,因爲你構造類型文字的方式......所以一個很好的方法是從類型文字中刪除'',所以使用原始類型。 –

+0

@AndyTurner:謝謝 - 解決了它。 –

回答

1

感謝@AndyTurner。從TypeLiteral中刪除<?>解決了m的問題。這是編譯和工作:

final Class<UUID> idClass = UUID.class; 
    final Class<DAOService> ifClass = DAOService.class; 
    final Class<DAOServiceImpl> implClass = DAOServiceImpl.class; 

    for (Class<? extends PersistableObject> dbClass : r.getSubTypesOf(PersistableObject.class)) { 
     final ParameterizedType ifPt = Types.newParameterizedType(ifClass, dbClass, idClass); 
     final ParameterizedType implPt = Types.newParameterizedType(implClass, dbClass, idClass); 
     final TypeLiteral fromLiteral = TypeLiteral.get(ifPt); 
     final TypeLiteral toLiteral = TypeLiteral.get(implPt); 

     bind(fromLiteral).to(toLiteral); 
    }