私はこれが初めてで、いつ Java で DI を使用するのが適切かを理解したいと思います。異なる ping パラメータを使用して、異なるネットワークに ping を実行する必要があるとします。
クラス 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 つあります。
- PingService のコンストラクターに PingParams を挿入します。
これは正しいです?つまり、DI コンテナーはタイムアウトを認識できず、"Produces" アノテーション付きメソッドを作成しない限り、PingParams への注入を再試行します。この場合でも、オブジェクトを作成するためだけに大量の作業が行われます! もちろん、ネットワークごとに 1 つずつ、複数作成する必要がありますが、DI でそれを行うにはどうすればよいでしょうか。
- クライアントに PingService を注入します。
正当に思えますが、PingService は PingParams に依存しているため、インジェクション ポイント 1 に到達します。
DIを使用する唯一の適切な方法は、依存関係を持たない(したがって役に立たない)クラスを使用するか、すべての依存関係をパラメーターとしてサービスメソッドに渡す非常に単純なサービスクラスを使用することです。たとえば、ping メソッドで ip と PingParams を受け入れる PingService の場合も、このクラスには依存関係がありません...
何か不足していますか?これらの「データ」クラス、データを保持するためのフィールド (PingParams) のみを含むクラスで DI をどのように使用できますか? これらの場合、DIを避けるべきだと思いますか? ありがとう