2017-05-06 18 views
2

나는 단검 2를 공부하므로 기본적인 것들을 이해하고 싶습니다. 나는 다음과 같은 코드가 있습니다 :의존성을 선언하는 방법

@Module 
public class MainModule { 

@Provides 
public Presenter provideMainActivityPresenter(Model model){ 
    return new MainPresenter(model); 

} 

@Provides 
public Model provideMainModel(){ 
    return new MainModel(); 
} 
} 

MainPresenter 클래스는 다음과 같습니다 대신 위의 코드의

public class MainPresenter implements Presenter { 

@Nullable 
private ViewImpl view; 
private Model model; 



public MainPresenter(Model model) { 
    this.model = model; 
} 

@Override 
public void setView(ViewImpl view) { 
    this.view = view; 
    } 
} 

, 다음과 같은 처리를 할 수

?

public class MainPresenter implements Presenter { 

@Nullable 
private ViewImpl view; 

@Inject 
Model model; 


@Override 
public void setView(ViewImpl view) { 
    this.view = view; 
} 
} 

MainPresenterModel에 의존하기 때문에 그것은 @Nullable 없습니다.
아니면 틀린가요? 내가 @Inject

+0

단검의 기본 사항을 이해해야합니다. 이 자습서를 시도하십시오 : https://www.techyourchance.com/dagger-tutorial/ – Vasiliy

답변

4

를 사용해야하는 경우

나는 당신이

  • 생성자 주입
  • 필드를 단검을 사용하는 기본적으로 3 가지 방법이 내가 생성자의 인수로 종속성을 넣어해야 할 때 이해하지 않거나 주입
  • 모듈에서 직접 제공

는 클래스를 제공하는 모듈을 사용하고 다음


(또한 객체를 생성 한 후 메서드를 호출하는 방법 주입이있다). 잘못하지는 않았지만 이것은 작성하고 유지 관리하는 데 가장 많은 오버 헤드입니다. 요청 된 의존성에 전달하여 객체를 생성하고 반환 :

이 작업은 한 장소에서 개체를 만들 수 Gson, OkHttp, 정도 Retrofit 같은 추가 설정이 필요 것들과 함께 사용되어야한다
// in a module 

@Provides 
public Presenter provideMainActivityPresenter(Model model){ 
    // you request model and pass it to the constructor yourself 
    return new MainPresenter(model); 
} 

필요한 의존성.


다음은 액세스 권한이 없거나 사용하지 않을 개체를 삽입하는 데 사용됩니다. 당신은 필드에 주석하고 구성 요소에서 방법을 등록 할 개체를 주입 :

@Component class SomeComponent { 
    void injectPresenter(MainPresenter presenter); 
} 

public class MainPresenter implements Presenter { 

    // it's not annotated by @Inject, so it will be ignored 
    @Nullable 
    private ViewImpl view; 

    // will be field injected by calling Component.injectPresenter(presenter) 
    @Inject 
    Model model; 

    // other methods, etc 
} 

이 또한 발표자 모든 클래스를 등록하는 오버 헤드를 제공 할 것입니다 당신이 생성자를 사용할 수없는 경우에 사용한다 활동, 파편 또는 서비스와 같은 그렇기 때문에 모든 Dagger 샘플에는 Android 프레임 워크의 일부를 주입하는 방법이 onCreate() { DaggerComponent.inject(this); } 있습니다.


가장 중요한 것은 생성자 삽입을 사용할 수 있다는 것입니다. 생성자에 @Inject으로 주석을 달고 대거가 생성 방법을 찾도록하십시오.

public class MainPresenter implements Presenter { 

    // not assigned by constructor 
    @Nullable 
    private ViewImpl view; 

    // assigned in the constructor which gets called by dagger and the dependency is passed in 
    private Model model; 

    // dagger will call the constructor and pass in the Model 
    @Inject 
    public MainPresenter(Model model) { 
    this.model = model; 
    } 
} 

에만 클래스 생성자를 주석 것을 요구하고 단검 모든 종속성 (생성자 인자,이 예에서는 모델)을 제공 할 수 있음을 주어, 그것을 처리하는 방법을 알 수 있습니다.


위에서 언급 한 모든 방법은 개체를 만들고 다른 상황에서 사용할 수 있어야합니다.

이러한 메서드는 모두 생성자에 종속성을 전달하거나 @Inject 주석 필드를 직접 삽입합니다. 의존성은 생성자에 있거나 @Inject에 의해 주석을 달아서 단검이 그것에 대해 알 수 있도록해야합니다.

또한 the basic usage of Dagger 2에 대한 블로그 글을 썼습니다.

+0

: Retrofit, Gson과 같은 추가 설정이 필요한 경우 모듈에서 제공을 사용하고 다른 클래스에서 사용할 필 요가있을 수 있습니다 내가 생성자에서 삽입을 사용할 수 있습니까? – ste9206

+1

@ ste9206 정확합니다. 생성자를 수정할 수있는 경우 생성자 삽입을 사용할 수 있으며 설정이 필요하면 모듈을 사용하고 생성자 (예 : Activities)에 액세스 할 수없는 경우 구성 요소에'inject (MyActivity a) '를 등록하십시오. –

+0

그래서 inject (...)는 파편과 서비스에서도 사용하는 것이 좋습니다. – ste9206