5

Google Guiceを使用して遅延バインディングを試みています。

public class MyClassProvider implements Provider<MyClass>{
    private DependencyClass dep;
    private WebService webservice;

    @Inject
    MyClassProvider(DependencyClass dep, WebService webservice){
        this.dep = dep;
        this.webservice = webservice;
    }

    public MyClass get() {
        MyClass myclass = webservice.call(dep);
    }
}

モジュールにバインディングがあります:

   bind(MyClass.class).toProvider(MyClassProvider.class).in(ServletScopes.REQUEST);

MyClass を使用する必要がある別のクラス ConsumerClass があります。ここで問題が発生します。特定の時点まで dep が null になるため、MyClass を ConsumerClass に Inject できないため、Provider を注入しました。

public class ConsumerClass {
    private MyClassProvider myClassProvider;

    @Inject
    public ConsumerClass(Provider<MyClass> myClassProvider){
       this.myClassProvider = myClassProvider;
    }

    ......

    public void myfunction() {
        // Here dep is initialized and become non-null here.

        // Then, I call
        MyClass myClass = myClassProvider.get();

    }
}

私が抱えている問題は、MyClassProvider を ConsumerClass に注入すると、MyClassProvider のインスタンスを作成しようとしたことです。その時点で dep が null であるため、失敗しました。とにかくプロバイダーの get() メソッドで dep が必要なため、 @Nullable として注釈を付けても問題は解決しません。

get() メソッドが呼び出されたときにのみ、Guice にプロバイダー インスタンスを作成させる方法はありますか? または、この問題に対する他の回避策はありますか?

どうもありがとう。


ジェフ: お返事ありがとうございます。

コードを次のように変更できるということですか。

public class MyClassProvider implements Provider<MyClass>{
        private Provider<DependencyClass> depProvider;
        private WebService webservice;

        @Inject
        MyClassProvider(Provider<DependencyClass> depProvider, WebService webservice){
            this.depProvider = depProvider;
            this.webservice = webservice;
        }

        public MyClass get() {
            DependencyClass dep = depProvider.get(); 
            MyClass myclass = webservice.call(dep);
        }
    }
4

1 に答える 1

3

に置き換えDependencyClassますProvider<DependencyClass>。Guice は、Guice が提供できる任意の型の Provider にアクセスするためtoProviderのメソッドを必要としません。@Provides

この方法depは、インスタンス化ではなく、MyProvider が呼び出されたときにのみ提供する必要があります。

于 2013-02-12T16:00:21.077 に答える