Guice - 以编程方式创建的绑定
问题描述:
我正在使用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中创建绑定的可能性?
答
感谢@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);
}
为什么你想要“动态”呢? –
你知道这是安全的,因为你构造类型文字的方式......所以一个很好的方法是从类型文字中删除'>',所以使用原始类型。 –
@AndyTurner:谢谢 - 解决了它。 –