Внедрение зависимостей при загрузке в зависимости от страны - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь добиться внедрения зависимости в зависимости от того, какая страна вызывает мою конечную точку во время выполнения, поэтому у меня есть следующая настройка.

public interface Client {
  void call(Data data);
} 

@Profile({"prod"})
public class ClientA implements Client {
  @Override
  public void call(Data data) {
    // implementations goes here
  }
}

@Profile({"dev"})
public class ClientB implements Client {
  @Override
  public void call(Data data) {
    // implementations goes here
  }
}

Но этой настройки сейчас достаточно, поскольку она зависит только от среды, в которой приложение работает на. Я посмотрел на пружины @Condition аннотации, но этого, похоже, недостаточно. То, чего я хочу добиться, чтобы иметь возможность определить свойство в моем файле свойств, которое определяет, для каких стран данный имплицит должен быть инициализирован во время выполнения. Так что-то вроде:

@Profile("${client.a.countries}")
public class ClientA implements Client {
  @Override
  public void call(Data data) {
    // implementations goes here
  }
}

и затем в моих файлах application.propeties я просто определяю client.a.countries=DE,GB,ES. Есть ли способ достичь этого? Поэтому, когда веб-интерфейс вызывает мою конечную точку, я знаю, из какой страны он вызывается, и поэтому должен знать, какую реализацию использовать. Я преследую это неправильно, если я собираюсь заняться реализацией шаблона Factory для достижения своей цели или это возможно с помощью Spring?

1 Ответ

1 голос
/ 31 марта 2020

Я решил это однажды, создав ClientRegistry, в котором все клиенты регистрируются в стране, для которой они предназначены (карта или около того)

public class ClientRegistry {
    private Map<String,Client> clients ;

    @Autowired
    public ClientRegistry(List<Client> clients) {

        this.clients = clients.stream().collect(Collectors.toMap(Client::getCountry, Function.identity() )) ;
    }

    public Client getClient(String country) {
        return clients.get(country);
    }
}

В интерфейсе клиента необходимо добавить getCountry

public interface Client
{
    void call(Data data);

    String getCountry();
}

Теперь у вас есть возможность разрешить ClientRegistry реализовывать функции Клиента и удалять вызовы соответствующему Клиенту или в Cotroller, который вы вызываете Клиента всегда как clientRegistry.getClient(country).call(data)

...