簡體   English   中英

Guice提供了隱式動態子類的實例

[英]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);

您還需要創建注釋本身,請參見示例:

https://github.com/google/guice/wiki/BindingAnnotations

您想要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.

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