0

我有一个 Guice 模块,它有一个 @Provides 方法,该方法接受 2 个参数并返回接口的两个实现之一

public class ClientModule extends AbstractModule{

    @Override
    protected void configure(){
    
    }
    
    @Singleton
    @Provides
    protected ClientInterfaces provideService(Class1 objectOfClass1, String runTimeGeneratedString){
       if(condition){
            return new firstImplementation();
       } else {
            return new someImplementation(objectOfClass1, runTimeGeneratedString);
       }
    }
}

我已经看到了这个几乎与我的问题相似的问题 - 将参数传递给 Guice @Provides 方法。但是在这里,这个问题的 OP 想要将常量 String 变量传递给 @Provides 方法,而在我的情况下,我想传递一个将在运行时生成的字符串。如何解决这个问题?任何形式的帮助将不胜感激。

谢谢

4

1 回答 1

1

两种可能,具体取决于您的意思。首先,仍然可以使用常量,但在运行时确定这些常量的值 - 在创建模块之前的 main()(或其他启动代码)中,计算出这些值应该是什么,并将它们传递给 ClientModule构造函数,并将它们保留为字段,并将它们绑定为常量。

另一方面,每次获取新实例时传递一个唯一参数与注入并不完全相同——这更像是一种工厂方法,这样您就可以请求一个带参数的实例。为此,请考虑辅助注射或自动工厂。这些工具将帮助您创建一个工厂,一个可以将运行时参数传递给的实例,并获得一个通过注入创建但仍包含这些参数的实例。

https://github.com/google/guice/wiki/AssistedInject

https://github.com/google/auto/tree/master/factory

如何使用 Guice 的 AssistedInject?

于 2021-03-11T02:29:33.230 回答