2011-12-20 9 views
1

Roboguiceを使用することを学んでおり、システムサービスを注入する方法を理解するのに困っています。私が見たすべての例はアクティビティに注入していますが、POJOに注入したいのです。 Roboguice 2.0 beta 3を使用しています。Roboguice注入システムサービス

私はPhoneNumberクラスを持っており、TelephonyManagerサービスを注入したいと考えています。

public class PhoneNumber { 
    @Inject TelephonyManager mTelephonyManager; 

    protected Integer getNetworkCountryPrefix() { 

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

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

答えて

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がその魔法を働かせる機会はありません。しかし、RoboGuiceがあなたのためにオブジェクトをインスタンス化することを許可した場合、それを注入すると、RoboGuiceはオブジェクトの作成を制御し、そのオブジェクトの中であなたのために注入を行うことができます。したがって、上記の例では、RoboGuiceが新しいPhoneNumberを作成してphone変数に入れると、RoboGuiceはそのインスタンスに対して注入を実行し、tmが正しく注入されます。明らかに、RoboGuiceにそれをさせる代わりにnew()演算子を使ってPhoneNumberを構築すると、RoboGuiceは注入を実行する機会を持たず、tmはnullになります。

#3があなたのために働くなら、私はそれに行きます。これは、最も柔軟なやり方であり、DIフレームワークがオブジェクトをインスタンス化することによって、良いプラクティスを奨励します。

しかし、PhoneNumberが、通常はRoboGuiceをインスタンス化できるようなものでない場合は、オプション#1を使用することをお勧めします。

+0

感謝を使用することができ、それは多くをクリアしました。 –

1

TelephonyManagerは、注入に使用できるデフォルトの標準システムサービスの1つではありません。あなたは他の分野にそれを注入する前に、あなたのモジュールにそのサービスを登録しなければならないでしょう。

http://code.google.com/p/roboguice/wiki/ProvidedInjectionsモジュールでこれを行うことにより、あなたが、注射のためにそれを登録することができます

bind(TelephonyManager.class).toProvider(new SystemServiceProvider<TelephonyManager>(Context.TELEPHONY_SERVICE)); 
1

あなたは、コンストラクタでこの

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

だけで必要なコンテキスト