如何在 guice 提供程序中使用 guice 注入器?

how to use guice injector in a guice provider?

我正在使用 guice 注入依赖项。

我有这个供应商:

public class RequestUrlRepository implements Provider<IRequestUrlRepository> {


    @Singleton
    @Override
    public IRequestUrlRepository get() {
        IRequestUrlRepository answer = null;
        if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){
            answer = new CostRequestUrlRepository(...);
        }
        else
        {
            answer = new RoutingRequestUrlRepository(...);
        }
          return answer;
    }
}

如何使用 guice 注入器来填充 new CostRequestUrlRepository(...);new RoutingRequestUrlRepository(...) 当它在提供程序中时?

如果不可能,我如何在不手动创建所有 ctor 参数的情况下初始化它们?

Providers 可以接受 @Inject-注解的构造函数和字段,Guice 的内置绑定将允许您为注入器可以提供的任何键注入 Injector 和 Provider(例如 Provider<CostRequestUrlRepository>).

@Singleton
public class RequestUrlRepository implements Provider<IRequestUrlRepository> {

    @Inject Provider<CostRequestUrlRepository> costRepositoryProvider;
    @Inject Provider<RoutingRequestUrlRepository> routingRepositoryProvider;
    @Inject Injector injector;

    @Override public IRequestUrlRepository get() {
        IRequestUrlRepository answer = null;
        if (System.getProperty("").equals(RouteOrCostRequest.cost.toString())){
            return costRepositoryProvider.get();
        } else {
            return routingRepositoryProvider.get();
        }

        // Alternatively:
        return injector.getInstance(Class.forName(System.getProperty("")));
    }
}

请注意,@Singleton 注释出现在 class 上,而不是方法;根据 Guice 邮件列表 "Scope annotations apply to providers as a whole, annotating the get() method with @Singleton is erroneous and ignored." (link).

理想情况下,您应该注入每个提供者,而不是注入整个注入器;这应该可以更轻松地查看系统的依赖项,然后您将减少对 Guice 的依赖,更多地依赖一般的 JSR330 注释。但是,如果您必须根据名称或变量中的 Class 文字实例化任意 class,那么注入 Injector 是可行的方法。