簡體   English   中英

配置在Guice中返回泛型類型的Provider

[英]Configuring a Provider that returns a generic type in Guice

我正在嘗試為使用JDBI創建的DAO設置Provider JDBI使用Handle對象(它是JDBC Connection的包裝器),您可以使用handle.attach(MyDaoType.class)來獲取DAO。 不必為每個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一起使用。 誰能指出我正確的方向?

感謝@condit為我指出能夠解決問題的東西。 它實際上非常簡單。 我更改了Provider實現,為Handler使用字段注入,如下所示:

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

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

  public DAOProvider(Class<T> daoType) {
    this.daoType = daoType;
  }

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

然后在我想要綁定的特定DAO類的任何模塊或應用程序中,我可以執行以下操作:

bind(UserStore.class).toProvider(new DAOProvider<>(UserStore.class));
bind(MessageStore.class).toProvider(new DAOProvider<>(MessageStore.class));

然后Guice自動將Handle注入DAOProvider實例。

我認為你這太復雜了。 當您調用get()方法時,您將結果存儲在引用中,這意味着您知道特定DAO的類型,這意味着您可以在知道DAO類的情況下編寫代碼。 我的意思是,想想吉斯本身是如何工作的,你叫Injector.getInstance(Class<?> type) ...換句話說,這樣的方法不能沒有你傳遞推斷出類型Class無論如何,所以通過Class時你用吧!

我可以理解為什么你可能不想直接注入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);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM