scoped di with dagger2

19
Scoped DI with Dagger2 Daum Cafe Mikael

Upload: myeongseok-baek

Post on 13-Apr-2017

111 views

Category:

Software


0 download

TRANSCRIPT

Scoped�DI�with�Dagger2

Daum�Cafe�Mikael

발표목차

• Intro�•Dagger�Overview�•Sample�App�•Objects�in�Scopes�•Custom�Scopes�•Scope을�구현하는�2가지�방법�•실행흐름

Intro

•https://github.com/frogermcs/GithubClient�•Dagger2를�application�/�user�/�activity�scope으로�나눠서�사용하는�방법�

•Subcomponent를�활용�•plus(서브�컴포넌트�생성)�메소드를�통해�명시적으로�life�cycle�관리

Dagger�Overview

• Component,�Module에�제공될�DI�객체들�정의�•사용하는�곳에서�@Inject�어노테이션을�통해�주입받음�

•Activity,�Fragment�등에서는�component에�대한�참조를�얻어서�자기�자신을�전달하여�의존성을�주입받음

Dagger�Component

• component는�아래를�정의�–DI로�제공될�객체들을�생성할�모듈(ApplicationModule)�

– Injection이�일어날�대상(BaseActivity)�–DI로�제공될�객체들(Context,�RetrofitServiceFactory,�UserRepository,�RxBus)

Dagger�Module

•DI로�제공할�객체들(Context,�RetrofitServiceFactory,�UserRepository,�RxBus)을�생성하는�로직들을�갖는다

Dagger�Component�&�Module

Dagger�Client

Dagger�Client

Sample�App

Objects�in�Scopes

•application�scope�–Application,�AnalyticsManager,�Validator,�HeavyExternalLibrary�등��

•user�scope�–User,�RepositoriesManager(User에�의존)��•activity�scope�–XXXActivity,�XXXPresenter,�XXXListAdapter,�LinearLayoutManager,�XXXFactory�등

Custom�Scopes

•@UserScope은�사용자�경험�측면에서는�아무런�차이도�없음�

•하지만�아키텍쳐�측면에서는���–User�인스턴스를�Intent의�파라미터로�전달하지�않고도�제공�

–메소드�파라미터에�user�data를�필요로�하는�클래스들은�user를�생성자�주입을�통해�전달�받을�수�있고,�앱의�런칭때�생성하지�않고,�필요한�시점에�초기화될�수�있음

Scope을�구현하는�2가지�방법�

•1.�@Subcomponent��•2.�Components�Dependencies��

•차이점:�객체�그래프�공유�방식

•1.�최초�app�시작�–Application#onCreate��

!AppComponent�built��

–Main�Activity#onCreate��!SplashActivityComponent�built�

실행�흐름

•1.�최초�app�시작

실행�흐름

•2.�username�입력�후�show�repositories�버튼�클릭

실행�흐름

•activity�scope�component�생성�

–UserComponent의�하위�컴포넌트로�RepositoriesListActivityComponent를�생성하고,�inject를�호출하여�DI

실행�흐름

•3.�back�button�click해서�usename�입력�화면으로�돌아올�때

실행�흐름

•4.�repository�clicked

실행�흐름