0

私はこれが初めてで、いつ 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 つあります。

  1. PingService のコンストラクターに PingParams を挿入します。

これは正しいです?つまり、DI コンテナーはタイムアウトを認識できず、"Produces" アノテーション付きメソッドを作成しない限り、PingParams への注入を再試行します。この場合でも、オブジェクトを作成するためだけに大量の作業が行われます! もちろん、ネットワークごとに 1 つずつ、複数作成する必要がありますが、DI でそれを行うにはどうすればよいでしょうか。

  1. クライアントに PingService を注入します。

正当に思えますが、PingService は PingParams に依存しているため、インジェクション ポイント 1 に到達します。

DIを使用する唯一の適切な方法は、依存関係を持たない(したがって役に立たない)クラスを使用するか、すべての依存関係をパラメーターとしてサービスメソッドに渡す非常に単純なサービスクラスを使用することです。たとえば、ping メソッドで ip と PingParams を受け入れる PingService の場合も、このクラスには依存関係がありません...

何か不足していますか?これらの「データ」クラス、データを保持するためのフィールド (PingParams) のみを含むクラスで DI をどのように使用できますか? これらの場合、DIを避けるべきだと思いますか? ありがとう

4

2 に答える 2

2

一般に、非データ クラスには依存性注入のみを使用する必要があります。データ コラボレーターと非データ コラボレーターの両方を含むクラスがある場合は、アシスト インジェクションを使用できます。

あなたが話している ping パラメーターは、実際には、アプリケーションの起動時にインスタンスにバインドされ、必要に応じて挿入される必要があります。あなたの例では、それは確かに多くのコードですが、長期的には、より大きなプロジェクトで物事をきれいに保ちます。

要約すると、アプリケーションの起動時に PingParam をバインドし (たとえば、Singleton として)、PingService に挿入し、DI なしで PingResult を作成します (既に行ったように)。

Dependency Injection のベスト プラクティスについては、Prasanna による Dependency Injection を読むことをお勧めします。

于 2013-12-29T15:40:55.300 に答える
0

CDI/溶接について話していると仮定します。PingParamsクラスがDBに保存され、構成がテーブルからロードされたとしましょう。それを抽象化しPingParams、DB からデータを読み取り、このデータ要素を返すクラスのプロデューサー メソッドを提供することは非常に理にかなっています。この構成にデータ オブジェクトを使用し、そのためのプロデューサーを提供することは悪い考えではありません。

于 2013-12-30T02:27:14.907 に答える