Создание объекта во время выполнения с помощью Google Guice - PullRequest
0 голосов
/ 18 октября 2018

Я создаю приложение, которое загружает файлы с S3 и DynamoDB от имени моих пользователей с их учетных записей AWS.Каждый пользователь регистрируется со своими учетными данными AWS в моей системе, чтобы начать с.

Когда мое приложение запускается, я считываю всю информацию о своих пользователях и создаю для них S3Client или DyanmoDBClient в зависимости от того, с кем они зарегистрированы.Во время выполнения я извлекаю объекты, используя данные зарегистрированного аккаунта.Код выглядит примерно так:

interface ReaderClient {
  public Object read();
}

public class S3Client implements ReaderClient {
  getInstance(account);
}

public class DynamoDBClient implements ReaderClient {
  getInstance(account);
}

class ReaderClientFactory {
  public static ReaderClient getReaderClient(User) {
    switch(user.database) {
        case S3:
            return S3Client.getInstance(user.account);
            break;
        case Dynamo:
            return DynamoDBClient.getInstance(user.account)
            break
    }
  }

}

Как заменить эту фабрику на Google Guice?Это вообще возможно?Я копался в провайдерах и помогал вводить, но не в состоянии приспособить их к этому сценарию.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 ноября 2018
 public class Main {
public static void main(String[]args){ReaderClientFactory factory = Guice.createInjector(new ReaderClientModule(user).getInstance(ReaderClientFactory.class));
    ReaderClient client = factory.create();}}interface ReaderClient {public Object read();}class S3Client implements ReaderClient {
public Object read(){
    System.out.println("S3 Client");
    return new Object();
}}class DynamoDBClient implements ReaderClient {
public Object read(){
    System.out.println("Dynamo DB Client");
    return new Object();
}}interface ReaderClientFactory {
public ReaderClient create();}class ReaderClientModule extends AbstractModule{

User user;

@Inject
ReaderClientModule(@Assited User user){
    this.user = user;
}

@Override
protected void configure(){
    switch(user.database){
        case S3:
           install(new FactoryModuleBuilder()
           .implement(ReaderClient.class, S3Client.class)
           .build(ReaderClientFactory.class));
           break:
        case Dynamo:
            install(new FactoryModuleBuilder()
                    .implement(ReaderClient.class, DynamoDBClient.class)
                    .build(ReaderClientFactory.class
            break;      
    }}  }
...