Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Dagger 2
Search
José Caique Oliveira
February 16, 2017
Programming
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dagger 2
Slides da palestra sobre Dagger 2
José Caique Oliveira
February 16, 2017
More Decks by José Caique Oliveira
See All by José Caique Oliveira
Kotlin Flow
jcaiqueoliveira
0
140
Coroutines And Flow
jcaiqueoliveira
2
150
Testing your app
jcaiqueoliveira
0
340
Modularizando seu app
jcaiqueoliveira
0
91
Nova Api de Localização Android
jcaiqueoliveira
0
110
Arquitetura para android
jcaiqueoliveira
6
330
Kotlin por onde começar?
jcaiqueoliveira
1
120
Introdução ao Android
jcaiqueoliveira
1
110
Arquitetura para projetos Android
jcaiqueoliveira
1
270
Other Decks in Programming
See All in Programming
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
540
Intent as Code
shoppingjaws
6
1.1k
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
4.8k
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
350
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
480
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
250
FreeBSDでZabbixを動かす
kenkino
0
310
JRuby: Past, Present, and Future
headius
0
160
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
500
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
790
Building an Out-of-Order CPU
latte72
1
790
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
510
Design in an AI World
tapps
1
320
Building Adaptive Systems
keathley
44
3.2k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
500
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
530
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Transcript
Dagger 2 Caique Oliveira
Introdução 1
Introdução ◦ Inversão de controle ◦ Injeção de dependência
O que é ◦ Framework para injeção de dependência ◦
Fork do Dagger 1 ◦ JSR 330
Alguns ganhos ◦ Evita boilerplate ◦ Organização das dependências ◦
Fácil criação de testes
Vamos ao Dagger 2 2
Annotations ◦ Module ◦ Provides ◦ Component ◦ SubComponent ◦
Scope ◦ Inject ◦ Reusable ◦ Singleton
Module Identifica uma classe provedora de dependências @Module public class
LoginModule
Provides Identifica que um método é um provedor de dependência
@Module public class LoginModule { @Provides AuthenticationLayer providesAuthenticationLayer(Context context) { return new AuthenticationLayer(context); } }
Quem prover a dependência de um provider ?
Outro “provedor” @Module public class ApplicationModule { private Application application;
public ApplicationModule(Application application) { this.application = application; } @Provides Application providesApplication() { return application; } @Provides Context providesContext(Application application) { return application.getBaseContext(); } }
Component Define quais módulos podem ser utilizados e quem pode
utilizar tais módulos @Component(modules = { ApplicationModule.class}) public interface MainComponent { void inject(LoginActivity activity); }
SubComponent Repartição do grafo de dependências @ActivityScope @Subcomponent(modules = {LoginModule.class})
public interface ActivityComponent { void inject(LoginActivity activity); } @Component(modules = {ApplicationModule.class}) public interface MainComponent { ActivityComponent activityComponent(); FragmentComponent fragmentComponent(); }
Scopo Altera o ciclo de vida de um objeto @Scope
@Retention(RetentionPolicy.RUNTIME) public @interface ActivityScope { }
Reusable Indica que um dado objeto pode ser reutilizado @Module
public class ManagerModule { @Reusable @Provides DataController providesDataController(Context context) { return new DataController(context); } @Provides @Reusable AuthenticationLayer providesAuthenticationLayer(Context context, AuthenticationClient authenticationClient) { return new AuthenticationLayer(context,authenticationClient); } }
Singleton Indica que se precisa da mesma instância do objeto
@Module public class ManagerModule { @Reusable @Singleton DataController providesDataController(Context context) { return new DataController(context); } @Provides @Singleton AuthenticationLayer providesAuthenticationLayer(Context context, AuthenticationClient authenticationClient) { return new AuthenticationLayer(context,authenticationClient); } }
Inject Indica que é necessário injetar uma depêndencia public class
LoginActivity extends BaseActivity { @Inject public LoginPresenter loginPresenter; @Override public void onStart() { super.onStart(); ((Application) getApplication()).getMainComponent().activityComponent().inject(this); loginPresenter.bindView(this, this); } }
Inject Indica que é necessário injetar uma depêndencia public class
Application extends CoreApplication { private MainComponent mainComponent; @Override public void onCreate() { super.onCreate(); initDagger(); } private void initDagger() { mainComponent = DaggerMainComponent.builder().applicationModule(new ApplicationModule(this)).build(); } public MainComponent getMainComponent() { return mainComponent; } }
Refatorando para o Dagger 2 3
Refatorando - LoginPresenterImpl class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener { private
Context context; private LoginView loginView; private LoginInteractor loginInteractor; LoginPresenterImpl(Context context, LoginView loginView) { this.context = context; this.loginView = loginView; this.loginInteractor = new LoginInteractorImpl(context); } ... }
Refatorando - LoginPresenterImpl class LoginPresenterImpl implements LoginPresenter, OnLoginFinishedListener { private
Context context; private LoginView loginView; private LoginInteractor loginInteractor; @Inject LoginPresenterImpl(LoginInteractor loginInteractor) { this.loginInteractor = loginInteractor; } @Override public void bindView(Context context, LoginView view) { this.context = context; this.loginView = view; } }
Refatorando - LoginInteractorImpl class LoginInteractorImpl implements LoginInteractor { private Context
context; LoginInteractorImpl(Context context) { this.context = context; } @Override public void authenticate(String email, String password, OnLoginFinishedListener listener) { //... new AuthenticationLayer(context).postAuthenticate(new AuthenticateRequest(email, password)); } @Override public void busAuthenticate(AuthenticateResponse authenticateResponse, OnLoginFinishedListener listener) { if (authenticateResponse.isSuccess()) { saveInformations(authenticateResponse); new UserManager().deleteAll(); new UserLayer(context).getUsers(); }else{ //... } } private void saveInformations(AuthenticateResponse authenticateResponse) { DataController dataController = new DataController(context); dataController.writeData(Constants.SharedPreferences.CONTROLLER_EMAIL, authenticateResponse.getEmail()); } }
Refatorando - LoginInteractorImpl class LoginInteractorImpl implements LoginInteractor { private UserLayer
userLayer; private Context context; private AuthenticationLayer authenticationLayer; private DataController dataController; private UserManager userManager; @Inject LoginInteractorImpl(Context context, AuthenticationLayer authenticationLayer, DataController dataController, UserManager userManager, UserLayer userLayer) { this.authenticationLayer = authenticationLayer; this.context = context; this.dataController = dataController; this.userManager = userManager; this.userLayer = userLayer; } … }
LoginModule @Module public class LoginModule { @Provides AuthenticationLayer providesAuthenticationLayer(Context context)
{ return new AuthenticationLayer(context); } @Provides @Reusable LoginInteractor providesLoginInteractor(Context context, AuthenticationLayer layer, DataController dataController, UserManager userManager, UserLayer userLayer) { return new LoginInteractorImpl(context, layer, dataController, userManager, userLayer); } @Provides @Reusable LoginPresenter providesLoginPresenter(LoginInteractor loginInteractor) { return new LoginPresenterImpl(loginInteractor); }
LoginModule @Module public class LoginModule { @Provides @Reusable DataController providesDataController(Context
context) { return new DataController(context); } @Provides @Reusable UserLayer providesUserLayer(Context context) { return new UserLayer(context); } @Provides @Reusable UserManager providesUserManager() { return new UserManager(); } }
Grafo de dependências Presenter Interactor UserManager AuthenticationLayer UserLayer DataController
Obrigado! Dúvidas?
Olá! Contate-me https://github.com/jcaiqueoliveira https://www.linkedin.com/in/caique-oliveira-43806895/
[email protected]