java - Guice:一个 "Provider<T>"用于多个实现

标签 java dependency-injection inversion-of-control guice

我有一个接口(interface)有 20 个左右带注释的实现。如果我在编译时知道我需要哪个,我可以注入(inject)正确的,但我现在需要根据运行时参数动态注入(inject)一个。

据我了解文档,我将不得不使用 20 左右 Provider<T>注入(inject)然后使用我需要的那个,这对我来说似乎太过分了。有没有办法得到类似 inst(Provider<T>).get(MyAnnotation.class) 的东西?绑定(bind)特定的实现,然后只有那个 Provider注入(inject)我的类(class)?

最佳答案

注入(inject)MapBinder .

在您的模块中,将绑定(bind)加载到 MapBinder 中,然后使您的运行时参数也可注入(inject)。此示例基于文档中的示例:

public class SnacksModule extends AbstractModule {
  protected void configure() {
    MapBinder<String, Snack> mapbinder
           = MapBinder.newMapBinder(binder(), String.class, Snack.class);
    mapbinder.addBinding("twix").to(Twix.class);
    mapbinder.addBinding("snickers").to(Snickers.class);
    mapbinder.addBinding("skittles").to(Skittles.class);
  }
}

然后,在您的对象中,注入(inject) Map和参数。对于这个例子,我假设你已经绑定(bind)了一个 java.util.Properties 对于您的运行时参数:

@Inject
public MyObject(Map<String, Provider<Snack>> snackProviderMap, Properties properties) {
  String snackType = (String) properties.get("snackType");
  Provider<Snack> = snackProviderMap.get(property);
  
  // etc.
}

注意,与MapBinder相同你可以注入(inject)一个简单的 Map<String, Snack>Map<String, Provider<Snack>> ; Guice 将两者结合起来。

关于java - Guice:一个 "Provider<T>"用于多个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30133305/

相关文章:

dependency-injection - 使用 InRequestScope 与 Ninject 进行 Hangfire

c# - 如何在 ASP.NET 5 (vNext) 中设置 SignalR Hub 依赖注入(inject)?

mvvm - MvvmCross IoC 中的子容器

design-patterns - 避免服务和 DI 的循环引用

java - 有没有办法让 Guice 在 Guice.createInjector 期间快速失败

java - 哪个 Eclipse 版本与 Tomcat 10 兼容,或者我应该返回 Tomcat 9?

java - 为什么 Platform.runLater 不检查它当前是否在 JavaFX 线程上?

java - 413 请求实体太大 - 使用 Spring Boot 和 Rest 模板

java - 为什么 spring 不使用我的 Converter<String, Date>?

c# - 我应该如何将行为注入(inject)实体