Я недавно добавил поле Throttler
в класс Server
, который должен быть создан, только если включено дросселирование (это запись конфигурации), и если да, то максимальное количество запросов в секунду (другая запись конфигурации) передан его конструктору.Как передать настраиваемый параметр конструктору при использовании Провайдера?
Вот код без зависимостей инъекции Throttler
:
public class Server {
private Config config;
private Throttler throttler;
@Inject
public Server(Config config) {
this.config = config;
if (config.isThrottlingEnabled()) {
int maxServerRequestsPerSec = config.getMaxServerRequestsPerSec();
throttler = new Throttler(maxServerRequestsPerSec);
}
}
}
public class Throttler {
private int maxRequestsPerSec;
public Throttler(int maxRequestsPerSec) {
this.maxRequestsPerSec = maxRequestsPerSec
}
}
Теперь впрыснуть Throttler
, я использовал Provider
, так как это не всегда необходимо создать экземпляр класса. Но теперь я вынужден вводить Config
в Throttler
и пусть он «настроится»:
public class Server {
private Config config;
private Provider<Throttler> throttlerProvider;
@Inject
public Server(Config config, Provider<Throttler> throttlerProvider) {
this.config = config;
this.throttlerProvider = throttlerProvider;
if (config.isThrottlingEnabled()) {
this.throttler = throttlerProvider.get();
}
}
}
public class Throttler {
private int maxRequestsPerSec;
@Inject
public Throttler(Config config) {
maxRequestsPerSec = config.getMaxServerRequestsPerSec();
}
}
Мне не нравится это решение, потому что:
- Существует зависимость из утилиты класса (
Throttler
) доConfig
. Throttler
теперь привязан к определенной записи конфигурации, что означает, что он не может использоваться ничем иным, кромеServer
.
Я бы предпочел как-то ввести maxRequestsPerSec
в конструктор.
Возможно ли это с помощью Guice?
Определенно проверить вспомогательную инъекцию, сделать вашу жизнь намного проще. –