Я новичок в этом, и я хочу понять, когда уместно использовать DI в Java. Предположим, мне нужно пропинговать разные сети с разными параметрами пинга:
Класс PingParams:
public class PingParams {
int timeout;
int retries;
}
Класс PingResult:
public class PingResult {
int ttl;
boolean available;
}
Класс PingService:
public class PingService {
private PingParams pingParams;
@Inject
public PingService(PingParams pingParams) {
this.pingParams = pingParams;
}
public PingResult ping(String ip) {
// ping using timeout and retries from pingParams
return new PingResult();
}
}
Клиент:
public class Client {
@Inject
PingService pingService;
private List<PingResult> doPing() {
List<PingResult> ret = new ArrayList<>();
String[] ips = new String[] {"127.0.0.1","127.0.0.2"};
for (String ip : ips) {
PingResult pr = pingService.ping(ip);
ret.add(pr);
}
return ret;
}
public static void main(String[] args) {
List<PingResult> prs = new Client().doPing();
System.out.println(prs);
}
}
У меня есть 2 точки инъекции:
- Я ввожу PingParams в конструктор PingService.
Это правильно? Я имею в виду, что контейнер DI не может знать тайм-аут и повторяет попытку внедрения в PingParams, если вы не создадите какой-либо аннотированный метод «Производит», даже в этом случае кажется, что для создания объекта требуется много работы! Но, конечно, вам нужно создать несколько, по одному для каждой сети, как вы это делаете с DI?
- Я внедряю PingService в клиент.
Кажется законным, но PingService зависит от PingParams, что приводит нас к точке внедрения номер 1.
Мне кажется, что единственный подходящий способ использования DI — это классы, у которых нет зависимостей (поэтому они бесполезны), или очень простые классы обслуживания, в которых вы передаете все зависимости в качестве параметров методам обслуживания. Например, PingService, который принимает ip и PingParams в методе ping, опять же, этот класс не будет иметь никаких зависимостей...
Я что-то упускаю? Как вы можете использовать DI с этими классами «данных», классами, которые содержат только поля для хранения данных (PingParams)? Предполагается ли избегать DI в этих случаях? Спасибо