2

Guice 対応のフレームワークを使用しています。

フレームワークによって作成されたクラス (または既存のバインディングをオーバーライドするサブクラス) を使用する場合、フレームワークが提供する変数を非常に簡単にインスタンス化できます。私が必要とするものは何でも、それはただの問題です

@Inject
FrameworkProvidedType variable;

ただし、カスタム作成されたクラスでは、それは機能しません。注入された変数はすべて null です。

インジェクションを使用するには、クラスにバインドが必要であることを理解しています。

既存のフレームワーク クラスをサブクラス化する場合、モジュール クラスでバインディングをオーバーライドできます。それはとても簡単です。

しかし、新しいクラスがあり、それを基礎となるフレームワークにバインドする方法がわかりません。

public Class myCustomClass {

   private String iNeedthis;
   private Context thisToo;

   @Inject
   FrameWorkThing magic;

   public myCustomClass(String iNeedThis, Context thisToo){
         this.iNeedThis = iNeedThis;
         this.thisToo = thisToo;
   }

   public void DoMagic(){
        //null pointer error because magic was not injected
        magic.doMagic(this.iNeedthis);
   }
}

この新しいクラスを Guice 対応にするにはどうすればよいですか?

ランタイムモジュールでこれを試しました

public Class<myCustomClass> bindMyCustomClass(){
    return MyCustomClass.class;
}

そして見事に失敗。

4

1 に答える 1

1

いいえ、ゲートから質問を却下して反対票を投じた@ bmorris591のおかげで、私は答えを見つけました.

フィールドをクラスに @Inject するということは、Guice によってクラス インスタンスを作成する必要があることを意味します。

ステップ 1 では、クラスのファクトリを作成しています。これは必要ないかもしれませんが、私にとってはうまくいきました。

public interface MyCustomClassFactory {
    public MyCustomClass create(String iNeedThis, Context thisToo);
}

ステップ 2 は、ファクトリを Guice にインストールします。

@Override
public void configure(Binder binder) {

    super.configure(binder);

    binder.install(new FactoryModuleBuilder().build(MyCustomClass.class));
}

私の特定のケースでは、私が使用しているフレームワークは、com.google.inject.Module の実装である Module クラスを提供します。

そのクラス内には、起動時に呼び出される「configure(Binder バインダー)」関数があります。

ステップ3は実際にコンストラクターに注釈を付けています

@Inject
public myCustomClass(String iNeedThis, Context thisToo){
     this.iNeedThis = iNeedThis;
     this.thisToo = thisToo;
}

私を正しい軌道に乗せた便利で関連するWebページ:

http://beust.com/weblog/2012/08/21/advanced-dependency-injection-with-guice/

これは補助注射について述べていますが、十分な情報と、次のステップに進むのが非常に簡単であることを理解するのに十分な単純な例を提供しました.

于 2013-04-11T02:23:52.583 に答える