0

こんにちは、私はバックグラウンドで C#/.NET を使用しており、Android を少し操作することを学びました。今は、楽しみのために小さなアプリを作成し始めており、IoC フレームワークを学ぶのに苦労しました。少しググった後、roboguice を見つけました。 .しかし、それを統合する方法がわかりません.On .

NET Ninject と Unity を使用しており、これらのフレームワークから取得した同様の形式のコンストラクター インジェクションを作成しようとしています。

ここに私がこれまでに持っているものと、私が考え出したと思うものがあります:

このクラスはアプリのブートストラップを表し、依存関係の構成クラスを登録する場所は次のとおりです。

public class IOCApplication extends Application{

@Override
public void onCreate(){
    super.onCreate();
    RoboGuice.setBaseApplicationInjector(this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), new IOCModule());
}

}

これは Dependency 構成クラスです。

 public class IOCModule implements Module{

        @Override
        public void configure(com.google.inject.Binder binder) {
            binder.bind(ITest.class).to(Test.class);
        }
    }

私の AndroidManifest では、これを追加しました:

<application ... android:name="com.example.project2.IOCApplication">

この部分を追加しなければならなかった理由はよくわかりませんが、IOCApplication を最初にインスタンス化する必要があることを Android に伝えるためのものだと考えています。

これは私の MainActivily クラスのクラスで、コンストラクターを追加しました。

public ITest test;
public MainActivity(ITest test){
    this.test = test;
}

Android デバイスでこれを実行しようとすると、アプリが無限ループに入っているように見え、ITest がインスタンス化されたとは思えません。

私は何を間違っていますか?

4

1 に答える 1

1

Android で知っておくべきことの 1 つは、独自のアクティビティをインスタンス化するのではなく、システムがインスタンス化するということです。

このため、アクティビティでコンストラクター インジェクションを使用することはできません。ただし、よりクリーンな IMO である属性インジェクションを使用できます。

RoboActivityでインジェクションを使用する最も簡単な方法は、クラスを拡張することActivityです。RoboGuice は、他の Android コンポーネント ( 、 など) に同様のクラスを提供しRoboFragmentますRoboService

public class MyActivity extends RoboActivity {

    @Inject
    ITest test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // You can now use your test instance
    }

}

を持つすべての属性は、呼び出された@Inject後にインスタンス化されます。super.onCreate(savedInstanceState);


POJO (Plain Old Java Object) を使用すると、さらに多くのオプションがあります。

属性注入

public class Test {
    @Inject
    private Service1 service1;
    @Inject
    private Service2 service2;

    public Test() {
    }
}

コンストラクター注入

public class Test {

    private Service1 service1;
    private Service2 service2;

    @Inject
    public Test(Service1 service1, Service2 service2) {
        this.service1 = service1;
        this.service2 = service2;
    }
}

コンストラクター@Injectに引数がある場合は、アノテーションが必要であることに注意してください。


<application ... android:name="com.example.project2.IOCApplication">拡張Applicationクラスを使用していることをシステムに伝えるには、この行が必要です。それがなければ、Android は基本クラスを使用します。

詳細については、公式ドキュメントを読むことをお勧めします。

于 2013-08-30T21:02:53.613 に答える