2017-10-05 213 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); 
    }