簡體   English   中英

如何按類從Guice獲取對象列表?

[英]How to get a list of objects from Guice by their classes?

我定義了一些“變壓器”(功能),並需要它們的列表。 它們每個都是由Guice創建的,我正在使用以下代碼來獲取列表:

public class CombinedTransformer extends AbstractTransformer {
    @Inject CombinedTransformer(
            FirstTransformer firstTransformer,
            SecondTransformer secondTransformer,
            ThirdTransformer thirdTransformer) {
        transformers = ImmutableList.of(
                firstTransformer,
                secondTransformer,
                thirdTransformer);

我的名單很長,所以我想知道是否有更簡單的方法,例如

public class CombinedTransformer extends AbstractTransformer {
    @Inject CombinedTransformer(Injector injector) {
        transformers = injector.getList(
            FirstTransformer.class,
            SecondTransformer.class,
            ThirdTransformer.class);
    }
}

有這樣的東西嗎?

您可以為此使用多重綁定

Multibinder<AbstractTransformer> multibinder = Multibinder.newSetBinder(binder(), AbstractTransformer.class);
multibinder.addBinding().to(FirstTransformer.class);
multibinder.addBinding().to(SecondTransformer.class);
multibinder.addBinding().to(ThirdsTransformer.class);

然后可以注入Set<AbstractTransformer>

@Inject
CombinedTransformer(Set<AbstractTransformer> transformers) {
    // do whatever you want with the set
}

但是,如果不直接使用多重綁定,就無法做到這一點。 如果確實需要使用靜態已知的類列表來獲取對象列表,則可以在注入器周圍編寫包裝器並使用它:

public class ListInjectorWrapper {
    private final Injector injector;

    @Inject
    ListInjectorWrapper(Injector injector) {
        this.injector = injector;
    }

    @SafeVarargs
    public final <T> List<T> getList(Class<? extends T>... classes) {
        return Arrays.stream(classes).map(clazz -> injector.getInstance(clazz))
            .collect(Collectors.toList());
    }
}

然后注入它並用它來獲得您的變壓器:

@Inject
CombinedTransformer(ListInjectorWrapper injectorWrapper) {
    transformers = injectorWrapper.getList(
        FirstTransformer.class,
        SecondTransformer.class,
        ThirdTransformer.class
    );
}

暫無
暫無

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

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