1

私は Guice を初めて使用するので、これがばかげた質問である場合は申し訳ありませんが、かなりイライラしています。

私のモジュールでは、私が制御していないフレームワークのメンバーであるオブジェクトを構築しています。次に、後でそのインスタンスにバインドして、injector.getInstance(FrameworkClass.class); でアクセスできるようにします。

そのオブジェクトを構築するとき、コンストラクターによって注入されるように注釈が付けられている独自のオブジェクトの 1 つを使用したいと考えています。

すなわち

public class MyClass { 
    OtherClass dependency;

    @Inject
    Public MyClass(OtherClass dependency) {
       ....
    }
}

public class AModule extends AbstractModule {

    protected void configure() {
        MyClass frameworkDependency = ???
        FrameworkClass fc = new FrameworkClass(frameworkDependency);
        bind(FrameworkClass.class).toInstance(fc);
    }
}

この例では、 OtherClass はアノテーションのない単純なクラスですが、デフォルトの空のコンストラクターであるため、理解できる限り、Guice は新しいものを作成して MyClass コンストラクターに提供する必要があります。

私の質問は、モジュール内の MyClass の新しいインスタンスにアクセスして、フレームワーク クラスに提供できるようにするにはどうすればよいですか?

以前は、フィールド インジェクションを介して独自のクラスを注入していたので、次のようになりました。

public class MyClass { 

    @Inject
    OtherClass dependency;      
}

public class AModule extends AbstractModule {

    protected void configure() {
        MyClass frameworkDependency = new MyClass();
        requestInjection(frameworkDependency);
        FrameworkClass fc = new FrameworkClass(frameworkDependency);
        bind(FrameworkClass.class).toInstance(fc);
    }
}

可能であれば、 MyClass をコンストラクターとして注入したままにしておくことをお勧めします。

4

2 に答える 2

2

あなたの答えのようにメソッドを使用する場合@Provides、すべてのパラメーターはインジェクターを介して解決されます-バインディングアノテーションを使用する依存関係を含み、Provider<MyClass>MyClassだけでなくタイプのパラメーターを含みます。sを挿入Providerすることは、1つのクラスで依存関係の複数のインスタンスを取得するための最良の方法です。

@Provides FrameworkClass provideFrameworkClass(
    Dependency1 dep1, Provider<Dependency2> dep2Provider) {
  return new FrameworkClass(dep1, dep2Provider.get(), dep2Provider.get());
}

すべてのバインディングがGuiceで見つかる場合は、バインディング@Injectを使用して、コンストラクターに多かれ少なかれ外部からマークを付けることができます。コンストラクターを反射的に取得することは、コンパイラーに依存するよりも本質的に脆弱であるため、Guiceのドキュメントは実際にはこの手法よりもこの手法を好むことに注意してください。ただし、パラメータリストが長い場合は、このオプションが適している可能性があります。toConstructor@Provides

最後に、@ Providesメソッドが独自のクラスに値するほど十分に大きい(または複雑で十分なロジックを持っている)場合は、いつでも独自の実装を作成できます-必要なだけのイオンでProvider<FrameworkClass>完了します-作成を実装します@Inject手動で(。を介してバインドされbind(FrameworkClass.class).toProvider(FrameworkClassProvider.class)ます。

于 2012-12-21T02:02:12.070 に答える
0

だから私は自分の質問の答えを見つけました(最も単純な形式で):

フレームワーク オブジェクトの構成を Provides メソッドに移動することで、MyClass オブジェクトをパラメーターとしてメソッドに渡すことができ、そのパラメーターのインスタンス化で Guice ハンドルを渡すことができます。

@Provides
@Singleton
FrameworkClass provideFrameworkClass(MyClass dependency) {
    return new FrameworkClass(frameworkDependency);
}

しかし、それは、より複雑なケースで何が起こるかという疑問を投げかけます.私のフレームワークが単一の依存関係を取らなかった場合はどうなるでしょうか. n+ パラメータを取るには?

于 2012-12-20T12:09:28.767 に答える