4

ProviderJDBI を使用して作成された DAO 用にセットアップしようとしています。JDBI はHandleオブジェクト (JDBC のラッパーConnection) を使用し、 を使用して DAO を取得できますhandle.attach(MyDaoType.class)。DAO クラスごとに個別の実装を作成するよりも、次のようにProviderする方が理にかなっていると思いました。

public class DaoProvider<T> implements Provider<T> {

  private final Class<T> daoType;
  private final Handle handle;

  @Injected 
  public DaoProvider(Class<T> daoType, Handle handle) {
    this.daoType = daoType;
    this.handle = handle;
  }

  @Override
  public T get() {
    return handle.attach(daoType);
  }
}

しかし、これを Guice で結び付けるのは非常に難しいようです。この回答で提案されているように、最初のコンストラクター引数に注釈を使用してみまし。次のようなファクトリを定義しました。@Assisted

public interface DAOProviderFactory {
  <T> DAOProvider<T> create(Class<T> daoType);
}

FactoryModuleBuilder.implementedしかし、要点は、プロバイダー クラスを拡張する必要がないということであるため、メソッドを呼び出す方法が明確ではありません。

また、実際に必要なものを返すプロバイダを返すファクトリがあるとは、ちょっとおかしなことにも思えます!

これは Spring DI コンテナーを使用すると非常に簡単に実行できると思うので、Guice を使用するとそれが可能であると信じたいと思います。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

0

あなたはこれをあまりにも複雑にしていると思います。メソッドを呼び出すとget()、結果が参照に格納されます。これは、特定の DAO の型を知っていることを意味し、DAO クラスを知っているコードを記述できることを意味します。つまり、 Guice 自体がどのように機能するかを考えてみてください。つまり、このようなメソッドは、とにかくInjector.getInstance(Class<?> type)を渡さないと型を推測できないため、使用するときは を渡します。ClassClass

Handleただし、直接注入したくない理由は理解できます。たとえば、ラッパーを作成してみませんか。

public interface DaoProvider {
  <T> T provideDao(Class<T> daoType);
}

その後:

public class JdbiDaoProvider implements DaoProvider {
  private final Handle handle;

  @Inject
  JdbiDaoProvider(Handle handle) {
    this.handle = handle;
  }

  public <T> T provideDao(Class<T> daoType) {
    return handle.attach(daoType);
  }
}
于 2014-06-18T17:36:27.473 に答える