60
Introduction to Dagger 2 Marcello Galhardo

Introduction to Dagger 2 (Marcello Galhardo)

Embed Size (px)

Citation preview

Introduction to Dagger 2Marcello Galhardo

@marcellogalhardo

@marcellogalhardo

@MarcelloGalhard

[email protected]

/marcellogalhardo

Android Dev BRslack.androiddevbr.org

Do you know...

...inversion of control?

Do you know...

...inversion of control?

...Dagger?

Why should I use Dependency Injection?

Easy reuse of components

Safer and easier

refactoring

Easier testing

Activity

Presenter

Activity

Presenter

Repository

Activity

Presenter

Repository

Activity

Api

Presenter

Repository

Activity

CacheApi

public class Activity extends AppCompatActivity { private Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = new Presenter(); }}

public class Presenter { private Repository repository;

public Presenter() { repository = new Repository(); }}

Activity.java / Presenter.java

public class Activity extends AppCompatActivity { private Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = new Presenter(); }}

public class Presenter { private Repository repository;

public Presenter() { repository = new Repository(); }}

Activity.java / Presenter.java

public class Activity extends AppCompatActivity { private Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Api api = new Api(); Cache cache = new Cache(); Repository repository = new Repository(api, cache); presenter = new Presenter(repository); }}

Activity.java

public class Activity extends AppCompatActivity { private Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Api api = new Api(); Cache cache = new Cache(); Repository repository = new Repository(api, cache); presenter = new Presenter(repository); }}

Activity.java

● Too much boilerplate code;

Problems!

● Too much boilerplate code;

● Hard to maintain the dependency graph.

Problems!

Let's talk about Dagger

Dagger 2

● No Reflection;

Dagger 2

● No Reflection;

● Code generated at build time;

Dagger 2

● No Reflection;

● Code generated at build time;

● Easy to debug;

Dagger 2

● No Reflection;

● Code generated at build time;

● Easy to debug;

● Easy to maintain the dependency graph.

app/build.gradle

dependencies { annotationProcessor "com.google.dagger:dagger-compiler:2.8" compile "com.google.dagger:dagger:2.8" provided "org.glassfish:javax.annotation:2.8"}

@Singleton@Component(modules = { MainModule.class, ...})public interface MainComponent { void inject(Activity activity);}

MainComponent.java

@Singleton@Component(modules = { MainModule.class, ...})public interface MainComponent { void inject(Activity activity);}

MainComponent.java

@Singleton@Component(modules = { MainModule.class, ...})public interface MainComponent { void inject(Activity activity);}

MainComponent.java

@Singleton@Component(modules = { MainModule.class, ...})public interface MainComponent { void inject(Activity activity);}

MainComponent.java

@Singleton@Component(modules = { MainModule.class, ...})public interface MainComponent { void inject(Activity activity);}

MainComponent.java

@Singleton@Component(modules = { MainModule.class, ...})public interface MainComponent { void inject(Activity activity);}

MainComponent.java

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainModule.java

@Module public class MainModule { private static final int CACHE_SIZE_10_MB = 10 * 1024 * 1024; private static final int TIMEOUT = 20; @Provides public Presenter providesPresenter(Repository repository) { return new Presenter(repository); } @Provides @Reusable public Repository repository(Cache cache, Api api) { return new Repository(cache, api); } @Provides @Singleton public Cache providesCache() { return new Cache(CACHE_SIZE_10_MB); }

@Provides @Reusable public Api providesApi() { return new Api(TIMEOUT); }}

MainApplication.java

public class MainApplication extends Application { private MainComponent component;

@Override public void onCreate() { super.onCreate(); component = DaggerMainComponent.builder().build(); }

public MainComponent getComponent() { return component; }}

MainApplication.java

public class MainApplication extends Application { private MainComponent component;

@Override public void onCreate() { super.onCreate(); component = DaggerMainComponent.builder().build(); }

public MainComponent getComponent() { return component; }}

MainApplication.java

public class MainApplication extends Application { private MainComponent component;

@Override public void onCreate() { super.onCreate(); component = DaggerMainComponent.builder().build(); }

public MainComponent getComponent() { return component; }}

MainApplication.java

public class MainApplication extends Application { private MainComponent component;

@Override public void onCreate() { super.onCreate(); component = DaggerMainComponent.builder().build(); }

public MainComponent getComponent() { return component; }}

Activity

Application

Activity

Application

Component

Activity

Application

Component

Activity

MainModule

Application

Component

Activity

Modules...MainModule

Activity.java

public class Activity extends AppCompatActivity { @Inject Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainApplication application = getMainApplication(); MainComponent component = application.getComponent(); component.inject(this); }}

Activity.java

public class Activity extends AppCompatActivity { @Inject Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainApplication application = getMainApplication(); MainComponent component = application.getComponent(); component.inject(this); }}

Activity.java

public class Activity extends AppCompatActivity { @Inject Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainApplication application = getMainApplication(); MainComponent component = application.getComponent(); component.inject(this); }}

Activity.java

public class Activity extends AppCompatActivity { @Inject Presenter presenter;

@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainApplication application = getMainApplication(); MainComponent component = application.getComponent(); component.inject(this); }}

Repository

CacheApi

Repository

MockCacheMockApi

Api Cache

Examples

github.com/marcellogalhardo/events

github.com/marcellogalhardo/locations

Questions?

www.concretesolutions.com.br

Rio de Janeiro – Rua São José, 90 – cj. 2121Centro – (21) 2240-2030

São Paulo - Av. Nações Unidas, 11.541 3º andar - Brooklin - (11) 4119-0449

We help companies create successful digital products