2017-03-23 3 views
1

대거 2를 실험 중이므로 프레임 워크를 이해하기 위해 테스트하고 있습니다.대거 구성 요소 종속성 의미

@Module 
public class ApplicationModule { 

    private Application appContext; 

    public ApplicationModule(Application appContext) { 
     this.appContext = appContext; 
    } 

    @Provides 
    @Singleton 
    public Context provideContext() { 
     return appContext; 
    } 
} 

지금 나는 또한 NetworkComponent 원하는 : 모듈

@Component(modules = {ApplicationModule.class}) 
@Singleton 
public interface ApplicationComponent { 
    Context provideContext(); 
} 

:

그래서 내가 이런 식으로 정의 된 모든 응용 프로그램에 대한 싱글이 될 필요가있는 ApplicationComponent가 있어요 앱이 살아있는 한 살아 있어야합니다. 해당 네트워크 구성 요소는 ApplicationComponent에 대한 종속성이 있어야합니다. 그래서 나는 다음과 같이 내 networkcomponent 있습니다

@Component(dependencies = {ApplicationComponent.class}, modules = {NetworkModule.class}) 
@PerApp 
public interface NetworkComponent extends ApplicationComponent { 
    @Named(DaggerConstants.DEFAULT_RETROFIT) 
    Retrofit provideDefault(); 

    @Named(DaggerConstants.OTHER_RETROFIT) 
    Retrofit provideOther(); 

    void inject(MainActivity activity); 
} 

모듈 :

1) 나는 안드로이드 응용 프로그램의 두 가지 구성 요소를 저장 :

@Module 
public class NetworkModule { 

    @Named(DaggerConstants.DEFAULT_RETROFIT) 
    @PerApp 
    @Provides 
    Retrofit provideDefaultRetrofit() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://www.someurl.com/") 
       .build(); 

     return retrofit; 
    } 

    @Named(DaggerConstants.OTHER_RETROFIT) 
    @PerApp 
    @Provides 
    Retrofit provideOtherRetrofit() { 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl("http://www.someotherurl.com/") 
       .build(); 

     return retrofit; 
    } 

    @PerApp 
    @Provides 
    SharedPreferences networkPreferences(Context context) { 
     return context.getSharedPreferences("network", Context.MODE_PRIVATE); 
    } 
} 

나는 몇 가지 질문이 있습니다. 하지만 AppComponent와 NetworkComponent를 저장하는 것이 이상하게 보입니다. 내 ApplicationComponent가 NetworkComponent를 제공하는 것이 좋지 않습니까?

2) @PerApp 및 stuff는 무엇인가 의미합니까? 또는 @PerApp 주석이있는 라이브가 Object 인 것을보고 단검인데, 그렇지 않으면 삭제합니다. 이것은 나에게 명확하지 않다.

3) 예를 들어 @Singleton을 사용하여 모듈을 표시하는 것이 유용 할 수 있습니다. 가능하기 때문에 어떤 예에서도 볼 수 없습니다.

답변

3

Android의 애플리케이션에 두 구성 요소를 저장합니다. 하지만 나에게 AppComponent와 NetworkComponent를 저장하는 것이 이상하게 보입니다. 내 ApplicationComponent가 NetworkComponent를 제공하는 것이 좋지 않습니까?

구성 요소의 개념이 누락되었습니다. 구성 요소의 아이디어는 수명이 서로 다른 객체를 갖는 것입니다. 예 :

  • 개체 A은 singleton이어야합니다. 이 개체가 필요할 때마다 정확히 동일한 개체가됩니다.
  • 개체 B은 singleton이어야합니다. 당신의 활동이 파괴되고 새로운 대상이 만들어 질 때마다 창조 될 것입니다.
  • 개체 C은 단편이어야합니다. 프래그먼트가 연결되고 활동으로 분리 될 때마다 새 오브젝트가 작성됩니다.

    그래서 당신은 당신이 ComponentCComponentA에 대한 의존성이 ComponentB의 의존성, 갖고 싶어 것을 지정 (적절한 명명 된 의존성을 제공 그들 각각을 가정합니다.)

주석은 @PerApp 물건 수행을 그것은 무언가를 의미하거나 단검입니다. @PerApp 어노테이션이있는 객체가 존재하고 있지 않다면 그 객체를 삭제합니다.이것은 나에게 명확하지 않다.

사용자 지정 범위는 수명이 다한 개체에 유용합니다. 즉, 사용자 정의 범위가있는 구성 요소를 선언 한 경우 해당 구성 요소를 지우는 책임이 있으며 그 다음에 다음에 구성 요소에서 종속성을 묻는 메시지가 표시되면 새 개체가 생성됩니다.

위 예제에서 활동이 파괴되는대로 즉시 ComponentB을 null로 처리해야합니다. 그렇지 않으면 다음 번 요청할 때 B 개체가 제공됩니다.

예를 들어 @Singleton과 같이 모듈을 표시하는 것이 유용 할 수 있습니다. 가능하기는하지만 어떤 예에서도 볼 수 없기 때문입니다.

종속성 제공과 관련하여 아무런 차이가 없습니다. 그러나 호스팅 구성 요소의 범위를 기억하는 데 도움이 될 수 있습니다.

+0

정말 고마워요. – user1007522

+1

@RautDarpan,'YourAwesomeComponent c'를 가지면, 이처럼'c = null;'이 null이됩니다. – azizbekian

관련 문제