如何在 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)
.
因为我希望能够直接注入基本类型,所以我必须发挥创意...
- 将 ComputedProperty 接口声明为 ConfigurableProperty 的子接口
- 实施 ComputedPropertySource,它可以访问已设置的属性。 ComputedPropertySource 将具有较低的优先级,并且将 运行 在其他 属性 个源已经 运行.
之后
- 从其他 属性 查找中排除 ComputedProperty
- 为任何需要 "computed"
的属性扩展此接口
在 运行 时间,属性 源按顺序 运行,计算属性 运行 最后。
它有点老套,我会看看我是否可以再清理一下 post 使它工作的代码。
我有一个由多个模块使用的服务,在每个模块中,它定义了自己的提供者来提供依赖于另一个值的值。与其在该对象中包含所有其他值,我更愿意直接使用该单个值,但无法将 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)
.
因为我希望能够直接注入基本类型,所以我必须发挥创意...
- 将 ComputedProperty 接口声明为 ConfigurableProperty 的子接口
- 实施 ComputedPropertySource,它可以访问已设置的属性。 ComputedPropertySource 将具有较低的优先级,并且将 运行 在其他 属性 个源已经 运行. 之后
- 从其他 属性 查找中排除 ComputedProperty
- 为任何需要 "computed" 的属性扩展此接口
在 运行 时间,属性 源按顺序 运行,计算属性 运行 最后。
它有点老套,我会看看我是否可以再清理一下 post 使它工作的代码。