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
Toothpick - A fresh approach to DI - Short Version
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Daniel Molinero Reguera
September 26, 2017
Programming
0
73
Toothpick - A fresh approach to DI - Short Version
Presented at GDG East Bay - Samsung office
Daniel Molinero Reguera
September 26, 2017
Tweet
Share
More Decks by Daniel Molinero Reguera
See All by Daniel Molinero Reguera
TP3 & KTP: Simple, fast, and boilerplate-free DI for Kotlin
dlemures
0
73
Toothpick - A fresh approach to DI (Including Unit Testing)
dlemures
1
1.2k
Toothpick Bad Practices 🙅 and Nice Tricks 👌
dlemures
0
110
Dart & Henson - Better Android Intents
dlemures
1
240
Toothpick - A fresh approach to DI
dlemures
0
140
Toothpick & Dependency Injection
dlemures
1
2.1k
Other Decks in Programming
See All in Programming
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
220
そのAIレビュー、レビューしてますか? / Are you reviewing those AI reviews?
rkaga
6
4.6k
AgentCoreとHuman in the Loop
har1101
5
240
Vibe Coding - AI 驅動的軟體開發
mickyp100
0
180
AI時代の認知負荷との向き合い方
optfit
0
160
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
ぼくの開発環境2026
yuzneri
0
240
24時間止められないシステムを守る-医療ITにおけるランサムウェア対策の実際
koukimiura
1
120
Raku Raku Notion 20260128
hareyakayuruyaka
0
350
Smart Handoff/Pickup ガイド - Claude Code セッション管理
yukiigarashi
0
140
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
110
Basic Architectures
denyspoltorak
0
680
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.3k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
260
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
SEO for Brand Visibility & Recognition
aleyda
0
4.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
Making Projects Easy
brettharned
120
6.6k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Transcript
A FRESH APPROACH TO DI TOOTHPICK https://github.com/stephanenicolas/toothpick/
5IF"OESPJE5FBNJT)JSJOH jobs.groupon.com/careers/ @D_Lemures #ToothpickDI @GrouponEng @SteffNicolas
THE TALK WHY TOOTHPICK? USING TOOTHPICK REUSING INSTANCES
VERSION 2.0 CONCLUSION DEFINING DEPENDENCIES INJECTING DEPENDENCIES MODULES & BINDINGS SCOPE TREE SCOPE SINGLETONS MULTI-ACTIVITY FLOW @D_Lemures | #ToothpickDI
WHY TOOTHPICK? @D_Lemures | #ToothpickDI The Ancient Roma Coffee Machine
Visual Toy javierarres.wordpress.com
WHY TOOTHPICK? SIMPLER BETTER TEST SUPPORT EVEN FASTER @D_Lemures |
#ToothpickDI
USING TOOTHPICK public class DealPresenter { @Inject DealApiClient apiClient;
@Inject Navigator navigator; } @Singleton public class DealApiClient { Retrofit retrofit; @Inject public IceMachine(Retrofit retrofit) { this.retrofit = retrofit; } } JSR 330 annotations→nothing new here @D_Lemures | #ToothpickDI DEFINING DEPENDENCIES
INJECTING DEPENDENCIES public class DealActivity extends Activity { @Inject DealPresenter
presenter; @Override protected void onCreate() { super.onCreate(); Scope appScope = Toothpick.openScope(getApplication()); Toothpick.inject(this, appScope); } } @D_Lemures | #ToothpickDI USING TOOTHPICK
INJECTING DEPENDENCIES @D_Lemures | #ToothpickDI USING TOOTHPICK SCOPE MAKE INJECTIONS
public class DealActivity extends Activity { @Inject DealPresenter presenter; @Override protected void onCreate() { super.onCreate(); Scope appScope = Toothpick.openScope(getApplication()); Toothpick.inject(this, appScope); } }
INJECTING DEPENDENCIES @D_Lemures | #ToothpickDI USING TOOTHPICK DEAL PRESENTER public
class DealActivity extends Activity { @Inject DealPresenter presenter; @Override protected void onCreate() { super.onCreate(); Scope appScope = Toothpick.openScope(getApplication()); Toothpick.inject(this, appScope); } } DEAL APICLIENT NAVIGATOR RETROFIT
public class DealActivity extends Activity { @Inject DealPresenter presenter;
@Override protected void onCreate() { super.onCreate(); Scope appScope = Toothpick.openScope(getApplication()); appScope.installModules(new Module() {{ bind(Navigator.class).to(NavigatorImpl.class); bind(Retrofit.class).toInstance(retrofitInstance); }}); Toothpick.inject(this, appScope); } } MODULES & BINDINGS @D_Lemures | #ToothpickDI USING TOOTHPICK BINDINGS MODULES SCOPE
@D_Lemures | #ToothpickDI USING TOOTHPICK SCOPE 1 SCOPE 2 SCOPE
4 SCOPE 3 MODULES & BINDINGS
APPLICATION SCOPE ACTIVITY 1 SCOPE ACTIVITY 2 SCOPE SERVICE 1
SCOPE FRAGMENT 3 SCOPE FRAGMENT 1 SCOPE FRAGMENT 2 SCOPE SCOPE TREE @D_Lemures | #ToothpickDI USING TOOTHPICK
public class DealActivity extends Activity { @Inject DealPresenter presenter; @Inject
Context context; @Override protected void onCreate() { super.onCreate(); Scope scope = Toothpick.openScope(getApplication(), this); scope.installModules(new Module() {{ bind(Context.class).toInstance(this); }}); Toothpick.inject(this, scope); } } SCOPE TREE APPLICATION SCOPE ACTIVITY SCOPE @D_Lemures | #ToothpickDI USING TOOTHPICK
SCOPE SINGLETONS @D_Lemures | #ToothpickDI REUSING INSTANCES ANDROID INTENT ACTIVITY
FRAGMENT RECYCLER VIEW LOCAL SINGLETON
APPLICATION SCOPE ACTIVITY SCOPE APP SINGLETONS ACTIVITY SINGLETONS SCOPE SINGLETONS
@D_Lemures | #ToothpickDI REUSING INSTANCES
public class Module extends Module { public Module() { bind(ViewHelper.class).toInstance(new
ViewHelper()); } } SCOPE SINGLETONS SINGLETONS CAN BE DEFINED IN MODULES @D_Lemures | #ToothpickDI REUSING INSTANCES
@Singleton public class DealApiClient { } @ActivitySingleton public class ViewHelper
{ } APPLICATION SCOPE ACTIVITY SCOPE SCOPE SINGLETONS OR USING ANNOTATIONS @D_Lemures | #ToothpickDI REUSING INSTANCES
ACTIVITY 1 ACTIVITY 3 ACTIVITY 2 MULTI ACTIVITY FLOWS Purchase
Flow @D_Lemures | #ToothpickDI REUSING INSTANCES
APPLICATION SCOPE ACTIVITY 1 SCOPE FLOW SCOPE ACTIVITY 3 SCOPE
ACTIVITY 2 SCOPE MULTI ACTIVITY FLOWS @D_Lemures | #ToothpickDI REUSING INSTANCES
public class MyActivity extends Activity { @Inject ShoppingCart shoppingCart;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Scope scope = openScopes(getApplication(), FlowSingleton.class, this); Toothpick.inject(this, scope); } } @D_Lemures | #ToothpickDI REUSING INSTANCES MULTI ACTIVITY FLOWS
@FlowSingleton public class ShoppingCart { List<PurchaseItem> purchases… } FLOW SCOPE
MULTI ACTIVITY FLOWS @D_Lemures | #ToothpickDI REUSING INSTANCES
VERSION 2.0 RELEASABLE SINGLETONS @D_Lemures | #ToothpickDI BETTER SCOPE ANNOTATIONS
KILLING REGISTRIES BETTER API
CONCLUSION QUESTIONS ? COMMENTS ? @D_Lemures | #ToothpickDI
A FRESH APPROACH TO DI TOOTHPICK https://github.com/stephanenicolas/toothpick/ @D_Lemures #ToothpickDI @GrouponEng
@SteffNicolas