2012-07-03 102 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構造函數中指定。將會更加優雅和簡單。 –