1

私はRoboguiceの使い方を学んでいて、システムサービスを注入する方法を理解するのに苦労しています。私が見たすべての例はアクティビティに注入していますが、POJOに注入したいと思います。Roboguice2.0ベータ3を使用しています

PhoneNumberクラスがあり、TelephonyManagerサービスを注入したいと思います。

public class PhoneNumber {
    @Inject TelephonyManager mTelephonyManager;

    protected Integer getNetworkCountryPrefix() {

        // This gives a null pointer exception 
        mTelephonyManager.getNetworkCountryIso();
    }
}

RoboActivityを拡張するクラスに注入する場合、すべてが正常に機能します。しかし、RoboActivityを拡張しないクラスにTelephonyManagerを注入することは可能ですか?

4

3 に答える 3

9

はい、RoboGuiceを使用するときにオブジェクトにインジェクションを取得する主な方法は3つあります。

  1. インジェクションを実行するオブジェクトについては、RoboGuice.injectMembers()を自分で呼び出します。ほとんどのPOJOの場合、これはオブジェクトのコンストラクターで実行される可能性がありますが、他のときに実行することもできます。これは完全な解決策ですが、DIフレームワーク(RoboGuice)への依存関係をハードコードするため、オプションの中でおそらく最も望ましくないことに注意してください。

  2. すでに#1を実行しているクラスに注入します。あなたはすでにこの方法に精通しています...これはまさにRoboActivityが行うことです。基本的に、RoboActivityが行うことのほとんどは、RoboGuice.injectMembersを呼び出すだけです。

  3. TelephonyManagerを、それ自体が注入されたクラスに注入します。これは通常最も望ましい方法ですが、特定のケースでは望ましくない場合もあります。これについて以下に説明させてください。

    class MyActivity extends RoboActivity {
        @Inject PhoneNumber phone;
    
        ...
    }
    
    class PhoneNumber {
        @Inject TelephonyManager tm;
    }
    

    基本的に、RoboGuiceはインスタンスにインジェクションを実行するチャンスが必要です。RoboGuiceによって作成されていない通常のPOJOの場合、injectMembersを直接呼び出さない限り、RoboGuiceがその魔法を働かせる機会はありません。したがってソリューション#1です。ただし、RoboGuiceにオブジェクトのインスタンス化を許可した場合、たとえば。それを注入することにより、RoboGuiceはオブジェクトの作成を制御し、そのオブジェクトに注入を行うことができます。したがって、上記の例では、RoboGuiceが新しいPhoneNumberを作成してphone変数に入れると、RoboGuiceはインスタンスに対してインジェクションを実行し、tm適切にインジェクトされます。明らかに、RoboGuiceに実行させる代わりにnew()演算子を使用してPhoneNumberを構築すると、RoboGuiceはインジェクションを実行する機会がなくなり、tmはnullになります。

#3があなたのために働くなら、私はそれのために行きます。これは物事を行うための最も柔軟な方法であり、DIフレームワークにオブジェクトをインスタンス化させることで、優れたプラクティスを促進します。

ただし、PhoneNumberが通常、RoboGuiceにインスタンス化させるものではない場合は、オプション#1の使用を検討することをお勧めします。

于 2011-12-20T18:29:15.777 に答える
1

TelephonyManagerは、インジェクションに使用できるデフォルトの標準システムサービスの1つではありません。他の領域にサービスを注入する前に、そのサービスをモジュールに登録する必要があります。

http://code.google.com/p/roboguice/wiki/ProvidedInjections

モジュールでこれを行うことにより、インジェクション用に登録できます。

bind(TelephonyManager.class).toProvider(new SystemServiceProvider<TelephonyManager>(Context.TELEPHONY_SERVICE));
于 2012-04-04T13:37:55.740 に答える
1

コンストラクターでこれを使用できます

RoboGuice.getInjector(context).injectMembers(this);

コンテキストが必要です

于 2013-08-30T23:26:57.480 に答える