Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introdução ao Dagger 2

Introdução ao Dagger 2

Uma introdução abordada com códigos de exemplo para demonstrar a necessidade e como utilizar da forma mais simples possível o framework de injeção de dependência "Dagger".

Marcello Galhardo

January 24, 2017
Tweet

More Decks by Marcello Galhardo

Other Decks in Programming

Transcript

  1. Introdução ao Dagger 2
    Marcello Galhardo

    View Slide

  2. @marcellogalhardo
    @marcellogalhardo
    @MarcelloGalhard
    [email protected]
    /marcellogalhardo
    Android Dev BR
    slack.androiddevbr.org

    View Slide

  3. Você conhece...
    ...inversão de controle?

    View Slide

  4. Você conhece...
    ...inversão de controle?
    ...Dagger?

    View Slide

  5. Por que usar Injeção de
    Dependência?

    View Slide

  6. Reusar
    componentes

    View Slide

  7. Segurança ao
    refatorar

    View Slide

  8. Facilidade
    nos testes

    View Slide

  9. Activity

    View Slide

  10. Presenter
    Activity

    View Slide

  11. Presenter
    Repository
    Activity

    View Slide

  12. Presenter
    Repository
    Activity
    Api

    View Slide

  13. Presenter
    Repository
    Activity
    Cache
    Api

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. 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

    View Slide

  18. ● Muito código
    boilerplate;
    Problemas!

    View Slide

  19. ● Muito código
    boilerplate;
    ● Dificuldade em manter
    a árvore de
    dependências.
    Problemas!

    View Slide

  20. Vamos falar de Dagger

    View Slide

  21. Dagger 2
    ● Não usa Reflection,
    código gerado em
    buildtime;

    View Slide

  22. Dagger 2
    ● Não usa Reflection,
    código gerado em
    buildtime;
    ● Fácil de depurar;

    View Slide

  23. Dagger 2
    ● Não usa Reflection,
    código gerado em
    buildtime;
    ● Fácil de depurar;
    ● Facilidade de manter
    árvores de dependência.

    View Slide

  24. 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"
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  31. 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);
    }
    }

    View Slide

  32. 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);
    }
    }

    View Slide

  33. 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);
    }
    }

    View Slide

  34. 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);
    }
    }

    View Slide

  35. 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);
    }
    }

    View Slide

  36. 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);
    }
    }

    View Slide

  37. 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);
    }
    }

    View Slide

  38. 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);
    }
    }

    View Slide

  39. 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);
    }
    }

    View Slide

  40. 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;
    }
    }

    View Slide

  41. 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;
    }
    }

    View Slide

  42. 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;
    }
    }

    View Slide

  43. 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;
    }
    }

    View Slide

  44. Activity

    View Slide

  45. Application
    Activity

    View Slide

  46. Application
    Component
    Activity

    View Slide

  47. Application
    Component
    Activity
    MainModule

    View Slide

  48. Application
    Component
    Activity
    Modules...
    MainModule

    View Slide

  49. 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);
    }
    }

    View Slide

  50. 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);
    }
    }

    View Slide

  51. 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);
    }
    }

    View Slide

  52. 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);
    }
    }

    View Slide

  53. Repository
    Cache
    Api

    View Slide

  54. Repository
    MockCache
    MockApi
    Api Cache

    View Slide

  55. Exemplos

    View Slide

  56. github.com/marcellogalhardo/events

    View Slide

  57. github.com/marcellogalhardo/locations

    View Slide

  58. www.concretesolutions.com.br
    Rio de Janeiro – Rua São José, 90 – cj. 2121
    Centro – (21) 2240-2030
    São Paulo - Av. Nações Unidas, 11.541
    3º andar - Brooklin - (11) 4119-0449
    Ajudamos empresas a criar
    produtos digitais de sucesso

    View Slide