Нов съм в това и искам да разбера кога е подходящо да използвам 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, освен ако не създадете някакъв анотиран метод "Produces", дори в този случай това е огромна работа само за създаване на обект! Но, разбира се, трябва да създадете няколко, по една за всяка мрежа, как да направите това с DI?
- Инжектирам PingService в клиента.
Изглежда легитимно, но PingService зависи от PingParams, което ни отвежда до точка на инжектиране номер 1.
Струва ми се, че единственият подходящ начин за използване на DI е с класове, които нямат зависимости (следователно безполезни) или с много прости сервизни класове, където предавате всички зависимости като параметри на сервизни методи. Например PingService, който приема ip и PingParams в метода ping, отново този клас няма да има зависимости...
Изпускам ли нещо? Как можете да използвате DI с тези класове "данни", класове, които съдържат само полета за съхраняване на данни (PingParams)? Трябва ли да избягваме DI в тези случаи? Благодаря