[英]Guice provide instance of implicit dynamic subclass
我需要幫助,我有一個AbstractModule
,其中包含需要使用單個提供程序的子類列表。
我提供的類作為插件動態加載
我怎樣才能做到這一點
interface Plugin {X getX();}
class Plugin1 implements Plugin {X getX() {return X1;}}
class Plugin2 implements Plugin {X getX() {return X2;}}
public class ThreadDataModule extends AbstractModule {
@Override
protected void configure() {
//x_list will contain Plugin1,Plugin2,Plugin3 classes
for(Plugin plugin : plugin_list_classes) {
->> how can i bind 'plugin.getX().class to XProvider'
}
}
public class XProvider implements Provider<X> {
public X get() {
return Get Plugin at Thread.getX()
}
}
}
謝謝
===========================
我做了這樣的事情來解決這個問題,現在每個插件都必須實現getXProvider
方法🤦♂️。 有沒有更優雅的方式?
interface Plugin {
X getX();
public Provider getXProvider(Callable callable);
}
class Plugin1 implements Plugin {
public X getX() {return new X1;}
@Override
public Provider getXProvider(Callable callable) {
return new Provider<X1>() {
@Override
public X1 get() {
try {
return (X1) callable.call();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
};
}
public class ThreadDataModule extends AbstractModule {
@Override
protected void configure() {
//x_list will contain Plugin1,Plugin2,Plugin3 classes
for(Plugin plugin : plugin_list_classes) {
bind(plugin.getX().getClass()).toProvider((javax.inject.Provider)plugin.getXProvider(()-> {
return m_threadIndexToDependencies.get(m_threadIndex).X;
}));
}
}
}
我認為,如果要實現自定義提供程序,則不需要在configure中綁定。 一種或另一種方式。
不知道x_list_classes中的類與線程之間是什么關系。 每個線程有一個類嗎?
如果是,那么您要如何進行映射?
通常,您可以進行范圍內綁定,以便為每個范圍創建一個實例:
https://github.com/google/guice/wiki/Scopes
我認為您也可以使Thread成為作用域。
或者,也許您想為每個類添加自定義批注,以便可以為X的不同實例進行注解,如下所示:
@Inject
public SomeClass(@Foo X x) {}
然后,您需要使用annotatedWith()進行綁定:
bind(X.class).annotatedWith(Foo.class).to(X1.classs);
您還需要創建注釋本身,請參見示例:
您想要bind(...).toProvider(...)
:
for (Class<?> targetType : ...) {
bind(targetType).toProvider(new XProvider(...));
}
如果要將其他依賴項注入到XProvider
類中,則可以使用Binder.getProvider()
(如果位於AbstractModule
的子類中,則可以使用Binder.getProvider()
(或AbstractModule.getProvider()
從綁定器中獲取提供程序,或者可以使您的XProvider
本身可注射。
通常,使XProvider
本身可注入是較簡單的解決方案(只需執行bind(Foo.class).toProvider(FooProvider.class)
),但是聽起來您想使用類似的邏輯提供多個輸出類型,為此您可能想手動實例化提供程序對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.