dagger에 context를 주입하는 좋은 방법 @BindsInstance

안드로이드 앱을 실행하고 우리가 얻을수 있는 인스턴스중에 하나가 바로 context인데

 

context는 안드로이드 앱의 구석구석에서 필수적으로 쓰인다

 

SharedPreferences를 가져올때도 필요하고, 특정 퍼미션의 기능을 호출할때도 쓰이고

 

안쓰이는 곳이 없다

 

 

그런데 context 객체는 우리가 직접 만들수 있는게 아니라 안드로이드 시스템이 만들어주는 객체이기때문에

 

우리가 만든 클래스들이 context를 사용하기 위해서는 이 값을 파라메터를 통해서 전달받아야 한다

 

context를 dagger의 그래프 안으로 어떻게 주입할까?

 

앱이 실행되어있다면 context는 이미 사용가능한 상태이기때문에 우리는 이 값을 dagger에게 전달만 하면된다

context를 전달할수 있는 방법은 여러가지가 있는데

 

아래의 방법이 가장 많은 곳에서 찾을수 있는 예제다

 

 

AppModule의 생성자파라메터로 Context를 받아서 @Provides 어노테이션으로 주입해주는 방법이다

 

DaggerAppComponent 의 인스턴스를 만들때 빌더를 통해서 context를 포함한 appModule을 전달받아 생성한다

 

매우 이해하기 쉽다

 

위의 예제처럼 생성자 형태로 파라메터를 주입할수 있지만

builder 형태로 주입할수도 있다

 

이때 필요한 어노테이션은 @Component.Builder

그리고 각각의 파라메터를 주입받는 메소드들은 @BindsInstance를 사용해서

리턴값으로는 동일한 인터페이스 타입인 Builder 를 리턴해야한다

이렇게 해서 메소드 체이닝이 가능해진다

 

 


그리고 소개할 다른 방법은 component factory에서 @BindsInstance 어노테이션을 사용하는 것이다

 

큰 차이점이라면 첫번째의 예는 AppModule을 통해서 context를 전달받았고,

 

두번째예는 Component를 생성할때 Context를 전달받았다라는것 정도이다

 

 

Component를 만들때는 굳이 Factory 클래스를 만들지 않아도 되는데

 

AppComponent 의 구현체를 초기화 할때 context객체를 파라메터로 전달할것이기 때문에


별도의 Factory 클래스를 만들어야한다

 

그리고 팩토리 클래스에서 context 파라메터 앞에 @BindsInstance 라는 어노테이션을 사용하면

 

dagger에게 앞으로 context가 필요하면 이값을 전달하라고 알려주는 방법이된다 

 

굳이 @Provides 어노테이션을 사용하지 않아도 dagger는 context의 주입방법을 알게 된다

 

 

 

두방식의 큰차이는 없는데 다만 새로운 @BindsInstance 의 어노테이션이 이렇게 사용될수 있다는 것을 알아두도록하자

 

 

| 1 | ··· | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ··· | 209 |