如何在 Guice 4.1 中注入依赖于另一个值的 属性?

How can I inject a property which is dependent upon another value in Guice 4.1?

我有一个由多个模块使用的服务,在每个模块中,它定义了自己的提供者来提供依赖于另一个值的值。与其在该对象中包含所有其他值,我更愿意直接使用该单个值,但无法将 Guice 的 bindConstant() 用于提供程序。

当前伪代码:

ConfigurationProvider implements Provider<Configuration> {
    final Configuration configuration;
    @Inject
    public ConfigurationProvider(BuildConfiguration buildConfiguration) {
        configuration = new Configuration();
        configuration.setDownloadPath(buildConfiguration.getBuildPath() + File.separator + "downloads");
    }

    public Configuration get() {
        return configuration;
    }
}

模块内部:

bind(Configuration.class).toProvider(ConfigurationProvider.class);

相反,我想在可能的情况下使用我的 属性 注入,然后做这样的事情:

    DownloadPathProvider implements Provider<Property<DownloadPath, String>> {
     final String downloadPath;
     @Inject public DownloadPathProvider(BuildConfiguration buildConfiguration) {
      downloadPath = buildConfiguration.getBuildPath() + File.separator + "downloads";
     }

     public String get() {
         return downloadPath;
     }
}

我认为问题是要使 bindConstant 起作用,我需要在初始化模块时确定该值。但本例中的值是稍后派生的(实际上是通过另一个提供者)。

虽然它可以将配置放入简单的 pojo 中,但我觉得直接使用 属性 比将其嵌套在 pojo 中更简洁。

配置或值实际上是一个常量,因为一旦设置就永远不会改变。我只想将该值基于另一个值。

如果该值在模块创建时不固定,则该值不是常量。它实际上是一个单例。而不是使用 bindConstant(),只是 bind().in(Scope.Singleton).

因为我希望能够直接注入基本类型,所以我必须发挥创意...

  1. 将 ComputedProperty 接口声明为 ConfigurableProperty 的子接口
  2. 实施 ComputedPropertySource,它可以访问已设置的属性。 ComputedPropertySource 将具有较低的优先级,并且将 运行 在其他 属性 个源已经 运行.
  3. 之后
  4. 从其他 属性 查找中排除 ComputedProperty
  5. 为任何需要 "computed"
  6. 的属性扩展此接口

在 运行 时间,属性 源按顺序 运行,计算属性 运行 最后。

它有点老套,我会看看我是否可以再清理一下 post 使它工作的代码。