2011-12-20 2 views
1

Roboguice를 사용하는 법을 배우고 있으며 시스템 서비스를 주입하는 방법을 이해하는 데 어려움을 겪고 있습니다. 필자가 보았던 모든 예는 액티비티에 주입하는 것이지만 POJO에 주입하려고합니다. Roboguice 2.0 베타 3을 사용하고 있습니다.Roboguice injectioning system service

저는 PhoneNumber 클래스가 있으며 TelephonyManager 서비스를 주입하려고합니다.

public class PhoneNumber { 
    @Inject TelephonyManager mTelephonyManager; 

    protected Integer getNetworkCountryPrefix() { 

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

RoboActivity를 확장하는 클래스에 삽입하면 모든 것이 잘 동작합니다. 그러나 RoboActivity를 확장하지 않는 클래스에 TelephonyManager를 삽입 할 수 있습니까?

답변

9

예, RoboGuice를 사용할 때 오브젝트에 주사를 삽입하는 세 가지 주요 방법이 있습니다.

  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을 고려할 수 있습니다.

+0

감사를 사용할 수 있습니다, 그것은 많은 것을 정리했다. –

1

TelephonyManager는 주입에 사용할 수있는 기본 표준 시스템 서비스 중 하나가 아닙니다. 모듈을 다른 영역에 삽입하기 전에 해당 서비스를 모듈에 등록해야합니다.

http://code.google.com/p/roboguice/wiki/ProvidedInjections 모듈에 이렇게 당신이 주사를 등록 할 수 있습니다

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

당신은 생성자에서이

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

단지 필요한 상황