[英]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.