4

クラスでマッパーを作成するための遅延ロード ロジックが必要です。各マッパーMapper<T>インターフェイスから継承されます。ただし、オブジェクトが機能している間は、入力の処理に応じて複数のマッパーを使用できます。

クラスにインジェクターを注入するのは良い方法ではないことがわかりますが、それを行わずにlazyloadを実装するにはどうすればよいですか? Provider<Mapper>プロバイダーには、必要な正確なマッパーを特定するオプションがないため、使用できません。

どうもありがとう。

4

1 に答える 1

3

これは最善の解決策ではないかもしれませんが、あなたにとってはうまくいくかもしれません。

動的入力を提供できるプロバイダーを実装できます。次に、そのプロバイダーをそれらを必要とするクラスに注入して、必要なオブジェクトを動的に作成できるようにします。

プロバイダーJavaDocからのスニペットは次のとおりです。

実装クラスは、Tを直接注入するのではなく、常にプロバイダーインスタンスを注入することを選択できます。これにより、複数のインスタンス、安全に変更して破棄したいインスタンス、スコープ外のインスタンス(@SessionScopedオブジェクト内から@RequestScopedオブジェクトを使用するなど)、または遅延初期化されるインスタンスにアクセスできる場合があります。

次のようになります。個人的には、インジェクターはインジェクションフレームワークの一部であるため、プロバイダーにインジェクターを注入することは問題ないと思います。目標は、インジェクターをアプリケーションコードから遠ざけることですが、これは確かにそうです。

public class FooProvider implements Provider<Foo>

    @Inject
    private Injector injector;

    private String input;

    public void setInput(String input){
        this.input = input;
    }

    @Override
    public Foo get(){
        if(input.equals("bar")){
            injector.getInstance(Bar.class); // Bar implements Foo
        }
        else{
            injector.getInstance(Baz.class; // Baz implements Foo
        }
    }
}

その後、他の場所...

public class Goo{

    @Inject
    Provider<Foo> fooProvider;

    public Foo goo(String input){
        fooProvider.setInput(input);
        return fooProvider.get();
    }
}

重要なのは、各プロバイダーインスタンスがインジェクションポイントごとに一意であることを確認することです。これはデフォルトであると思います。このプロバイダーは可変状態であるため、意図したとおりでない限り、これをアプリケーションにスローすることはできません(マルチスレッド環境で間違ったことを行う可能性があります)。次に、より多くの予防策を講じる必要があります。

于 2012-05-18T15:14:29.637 に答える