2016-06-20 7 views
1

내 프로젝트에서 Retrofit, RxJava, MVP 구현을 사용하여 Dagger 2를 사용하려고합니다. 그러나 가이드를 읽고 비디오를 보면서 작게 시작하고 그것이 어떻게 작동 하는지를 이해했다고 생각할 때, 나는 그렇지 않은 것처럼 보입니다. Here은 제가 이해하려고하는 샘플입니다.Dagger2 흐름 이해 (샘플 제공)

은 모듈 : 프래그먼트

@Module 
public class AppModule { 
    private App app; 

    public AppModule(App app) { 
    this.app = app; 
    } 

    @Provides @Singleton public SharedPreferences provideSharedPreferences() { 
    return PreferenceManager.getDefaultSharedPreferences(app); 
    } 

    @Provides @Singleton public HelloModel provideHelloModel(SchedulerProvider schedulerProvider, 
     HelloDiskCache helloDiskCache, HelloService helloService, Clock clock) { 
    return new HelloModel(schedulerProvider, helloDiskCache, helloService, clock); 
    } 

    @Provides public HelloDiskCache provideHelloDiskCache(SharedPreferences prefs) { 
    return new HelloDiskCache(prefs); 
    } 

    @Provides public HelloService provideHelloService() { 
    return new HelloService(); 
    } 

    @Provides public SchedulerProvider provideSchedulerProvider() { 
    return SchedulerProvider.DEFAULT; 
    } 

    @Provides public Clock provideClock() { 
    return Clock.REAL; 
    } 

    @Provides @Nullable public LayoutInflaterFactory provideLayoutInflaterFactory() { 
     return null; 
    } 

부품

@Component(
    modules = AppModule.class 
) 
@Singleton 
public interface AppComponent { 
    HelloModel getHelloModel(); 
    HelloDiskCache getHelloDiskCache(); 
    MainActivity inject(MainActivity activity); 
    HelloFragment inject(HelloFragment fragment); 
} 

, 발표자 (이것은 어디에서 오는인가?)를 주입

@Inject HelloPresenter presenter; 

발표자에

가 존재 생성자 주입

@Inject HelloPresenter(HelloModel helloModel) { 
this.model = helloModel; 

}

그래서, 우리는 조각에서 발표자를 삽입 할 수 와서 우리가 발표자에 주입 할 수있는 이유 어떻게? 대답은 매우 정교하지 않아도됩니다. 나는 어디에서 왔는지 추적 할 수 없기 때문에 바보 같다고 생각합니다.

답변

1

@Inject - 주석 처리 된 생성자는 수행 할 구성이 많지 않을 때 종속성에 대한 주석 처리 된 방법 대신 사용할 수 있습니다.

0123a에는 이러한 생성자가 있으므로 Dagger는 자동으로이 종속성을 삽입하거나이를 사용하여 그래프에 다른 객체를 만들고 제공 할 수 있습니다.

축척 된 생성자가있는 클래스 자체는 범위 주석 (예 : @Singleton)으로 주석을 달 수 있습니다. 이 경우 범위가 일치하는 구성 요소 만이 구성 요소를 볼 수 있습니다.

일반적으로 이러한 유형의 의존성 제공은 간략하지 만 항상 사용할 수있는 것은 아닙니다 (예 : Activity, SharedPreferences). 이 경우 @Module@Provides 방법을 사용해야합니다.

+0

흠, 일부 자습서를 거친 후 주입이 이루어지는 모든 장소가 Component에 언급되어야한다는 인상하에있었습니다 만,이 위치는 사용자가 호출하는 곳 (예 : App.getAppComponent)에만 적용됩니다. (getActivity()). 예를 들어 조각에 주사 (this). 필자는 왜 Component에없는 클래스에서 @Inject를 사용할 수 있으며 oncreate에서 주입 작업을 수행하지 않는다는 것이 내 문제라고 생각합니다. – buddhabath

+1

@buddhabath 필드와 생성자에'@ Inject' 주석을 사용하는 것에 약간의 혼란이있을 수 있습니다. * 필드 *에'@Inject'를 붙일 때,이 의존성을 만족시키기 위해서는'App.getAppComponent (getActivity()) .ins (this)'를 호출해야합니다. 반면에 Dagger에 생성자에 주석을 추가하면 그래프 생성 활동에서이 클래스가 필요한 경우이 생성자를 사용할 수 있다고 알려줍니다. 당신이 생성자에 접근 할 수없고 필드를 생성자 매개 변수로서 제공 할 수 없기 때문에'... into (this)) '를'Activity'에 호출하지 않을 방법이 없습니다. – AndroidEx

+0

'@ Inject' 주석 생성자에 대한 또 하나의 장점은 매개 변수가 그래프에서 자동으로 제공되고 일반적으로 클래스 필드를 채우는 데 사용된다는 것입니다. 예를 들어, HelloPresenter (HelloModel helloModel)의'helloModel'은 컴포넌트 내에서'provideHelloModel()'로부터 제공됩니다. 왜냐하면 두 종속성 제공자가 모두 컴포넌트에서 볼 수 있기 때문입니다. – AndroidEx

관련 문제