【问题标题】:GenericDao with GuiceGenericDao 与 Guice
【发布时间】:2012-07-24 12:24:48
【问题描述】:
我有一个接口 DAO<T>,以及它的通用实现 (GenericDAO<T> implements DAO<T>)。
我想做这样的事情:
public interface UserDao extends Dao<User> {
// code
}
// module
bind(UserDao.class).to(GenericDao.class);
有可能吗?
我设法自动向 GenericDao 注入了 Dao(我没有创建特定的 userdao 实现),但是,无法让它工作......
【问题讨论】:
标签:
generics
guice
typeliteral
【解决方案1】:
您最终必须为T 选择一个类型才能实际使用泛型类。对于您最终使用的每种类型,您都需要创建一个像这样的绑定(使用Integer for T)作为示例:
bind(new TypeLiteral<DAO<Integer>>(){})
.to(new TypeLiteral<GenericDAO<Integer>>(){});
【解决方案2】:
我认为您不能将UserDao 绑定到GenericDao。因为GenericDao 没有实现UserDao,尽管它们都有一个共同的祖先。如果GenericDao 类具有您需要的所有方法,那么您不需要单独的UserDao 类。您只需要 Jeff 所写的绑定:
bind(new TypeLiteral<DAO<User>>(){}).to(new TypeLiteral<GenericDAO<User>>(){});
然后,您的客户端类将依赖于DAO<User>,它们将收到GenericDAO<User>。如果您确实需要一些User 实体特定操作,那么您应该扩展GenericDao<User>。
我已经写了一篇关于这个topic的帖子。具体见文章底部。