2

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();
// ....

GenericDao<SomeBean>そして、いくつかの Bean に CRUD (abstract dao で実装) だけを含める場合は、上司のように注入したいと考えています。

それで、私はいくつかのハックを試し始め、次のものを手に入れました:

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);

誰かがそれを行う方法を知っていますか?

4

3 に答える 3

2

実際の実装については、この投稿を参照してください。

于 2012-07-26T10:17:15.020 に答える
1

たくさんのハックで、私はついにそれが機能するように管理しました。https://github.com/namekusei/persistence/blob/master/src/main/java/com/github/namekusei/inject/AbstractPersistentModule.javaをご覧になり、ご意見をお聞かせください。

于 2012-07-04T11:16:28.877 に答える
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){
   //...
}

}

コンポーネントとレイヤー間のバインディングをより適切に分離できるという理由だけで、これはより興味深いと思います。

于 2012-07-04T11:38:32.100 に答える