Есть ли другой способ передать параметры вместо передачи их из конструктора класса модуля.
Нет, это не совсем внедрение зависимости. Вы говорите о фабриках здесь:)
Для моего случая использования я не могу жестко закодировать значение набора материалов, поскольку оно всегда будет другим.
В этом случае яне вижу, как @Provides
поможет вам, потому что как только вы связываете @Named("materialSet")
и @Named("region")
, вы не можете их изменить.
Поскольку ваши значения всегда будут разными, я думаю, вам следует использовать Factory
для создания ComprehendHelper
экземпляров.
@Singleton
class AmazonComprehendFactory {
public AmazonComprehend create(final String materialSet, final String region) {
return AmazonComprehendClientBuilder.standard().withCredentials(
new OdinAWSCredentialsProvider(materialSet))
.withRegion(region).build();
}
}
@Singleton
class ComprehendHelperFactory {
private final AmazonComprehendFactory amazonComprehendFactory;
@Inject
ComprehendHelperFactory(AmazonComprehendFactory amazonComprehendFactory) {
this.amazonComprehendFactory = amazonComprehendFactory;
}
public ComprehendHelper create(final String materialSet, final String region) {
return new ComprehendHelper(amazonComprehendFactory.create(materialSet, region));
}
}
Если в вашем приложении всегда будет только 1 materialSetи регион, тогда у вас может быть класс для хранения вашей конфигурации и передачи его провайдеру следующим образом.
class AmazonComprehendConfig {
private final String materialSet;
private final String region;
AmazonComprehendConfig(String materialSet, String region) {
this.materialSet = materialSet;
this.region = region;
}
public String getMaterialSet() {
return materialSet;
}
public String getRegion() {
return region;
}
}
public class AWSModule extends AbstractModule {
@Override
protected void configure() {
}
@Singleton
@Provides
AmazonComprehendConfig provideAmazonComprehendConfig() {
//Load these from properties file or something like that.
return new AmazonComprehendConfig(materialSet, region);
}
@Singleton
@Provides
public AmazonComprehend getAWSComprehendClient(AmazonComprehendConfig amazonComprehendConfig) {
return AmazonComprehendClientBuilder.standard().withCredentials(
new OdinAWSCredentialsProvider(amazonComprehendConfig.getMaterialSet()))
.withRegion(amazonComprehendConfig.getRegion()).build();
}
}
Вы можете избежать использования класса конфигурации, если хотите, и использовать аннотации @Named
как-то так.
открытый класс AWSModule расширяет AbstractModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named("materialSet")).to("materialSet");
bindConstant().annotatedWith(Names.named("region")).to("region");
}
@Singleton
@Provides
public AmazonComprehend getAWSComprehendClient(@Named("materialSet") final String materialSet,
@Named("region") final String region) {
return AmazonComprehendClientBuilder.standard().withCredentials(
new OdinAWSCredentialsProvider(materialSet))
.withRegion(region).build();
}
}