2012-07-03 54 views
2

我试图建立一个简单的持久性存储与guice坚持和一些其他的东西。通用绑定与Guice

我已经有了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(); 
// .... 

而且如果我将刚才的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); 

有人知道一种方法来做到这一点?

+0

目前尚不清楚真正的实现来自哪里。你能澄清这个问题吗? –

+0

这就是问题所在,在这种情况下,真正实现了一套将只提供了'类',所以,我想使它成为执行时间莫名其妙...... – caarlos0

+0

却怎么你粘结剂知道哪些类扩展'GenericDao 在'具体的方法?这就是我的观点......即使你在这里完全知道了'T',我们仍然不知道实现。 –

回答

2

查看此post的工作实现。

+0

基本上这是我所做的..谢谢无论如何。 – caarlos0

1

我记得焊接是另一种方式来做到这一点,你可以使用@ InjectionPoint的说注入元素的类型..

class Foo { 
    @Inject 
    private GenericDAO<Employee> dao; 
    //... 
} 

.. 
@Produces 
public GenericDAO<T> createDaoInstances(InjectionPoint type){ 
    return new GenericDAO(type.getMember().getSomeThing()); 
} 

public GenericDAO<T>{ 
    //.. 
    public GenericDAO<T>(EntityManager em){ 
    //... 
} 

}

我认为这是一个更有趣的,只是因为你可以更好地分离组件和图层之间的绑定。

+0

如果我没有弄错,guice没有这样的'InjectionPoint'行为......这很难过,像你的例子那样的实现将会更加简单和干净...谢谢 – caarlos0

+0

是的caarlos0,但是你不能创建一个EntityManager的生产者工厂并在DAO构造函数中指定。将会更加优雅和简单。 –