Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dagger 2
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
José Caique Oliveira
February 16, 2017
Programming
1
150
Dagger 2
Slides da palestra sobre Dagger 2
José Caique Oliveira
February 16, 2017
Tweet
Share
More Decks by José Caique Oliveira
See All by José Caique Oliveira
Kotlin Flow
jcaiqueoliveira
0
130
Coroutines And Flow
jcaiqueoliveira
2
120
Testing your app
jcaiqueoliveira
0
310
Modularizando seu app
jcaiqueoliveira
0
74
Nova Api de Localização Android
jcaiqueoliveira
0
97
Arquitetura para android
jcaiqueoliveira
6
320
Kotlin por onde começar?
jcaiqueoliveira
1
100
Introdução ao Android
jcaiqueoliveira
1
92
Arquitetura para projetos Android
jcaiqueoliveira
1
240
Other Decks in Programming
See All in Programming
モダンOBSプラグイン開発
umireon
0
180
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
230
Rethinking API Platform Filters
vinceamstoutz
0
240
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
470
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
150
へんな働き方
yusukebe
5
2.8k
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1.1k
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
380
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
170
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
600
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
240
ファインチューニングせずメインコンペを解く方法
pokutuna
0
160
Featured
See All Featured
Mind Mapping
helmedeiros
PRO
1
130
Making Projects Easy
brettharned
120
6.6k
Design in an AI World
tapps
0
180
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
240
A Modern Web Designer's Workflow
chriscoyier
698
190k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Designing Experiences People Love
moore
143
24k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
How to Talk to Developers About Accessibility
jct
2
160
Raft: Consensus for Rubyists
vanstee
141
7.4k
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]