【发布时间】:2012-07-03 20:39:45
【问题描述】:
我尝试使用 guice persist 和其他一些东西构建一个简单的持久化库。
我已经有一个AbstractDao<T>,我可以像老板一样轻松扩展和绑定具体实现。
但是,我想要一种 GenericDao,像这样:
public abstract class GenericDao<T extends Bean> {
@Inject
private Provider<EntityManager> emp;
protected EntityManager em() {
return emp.get();
}
public AbstractDao() {
}
protected abstract Class<T> clazz();
// ....
如果我只为某个 bean 注入 CRUD(在抽象 dao 中实现),我想像老板一样注入 GenericDao<SomeBean>。
所以,我开始尝试一些技巧,并得到以下结果:
public abstract class AbstractPersistentModule extends AbstractModule {
protected <T extends Bean> LinkedBindingBuilder<T> bindGenericDao(final Class<T> clazz) {
return bind(
new TypeLiteral<GenericDao<T>>(){}
)./* what the hell can I do here? */;
}
}
如果我能做到,我就能做一个简单的:
bindGenericDao(Pessoa.class);
有人知道这样做的方法吗?
【问题讨论】:
-
不清楚真正的实现从何而来。你能澄清一下这个问题吗?
-
这就是问题所在,在这种情况下,真正的 impl 只会提供
Class<T>,所以,我试图以某种方式在执行时间... -
但是你的活页夹怎么能知道哪个类以具体的方式扩展了
GenericDao<T>?这就是我的意思......即使你在这里完全知道T,我们仍然不知道实现。 -
我在想我是否可以创建一个内部类和一个子注入器或类似的东西..