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
Daniel Molinero Reguera
September 26, 2017
Programming
0
77
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
75
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
250
Toothpick - A fresh approach to DI
dlemures
0
140
Toothpick & Dependency Injection
dlemures
1
2.1k
Other Decks in Programming
See All in Programming
Nuxt Server Components
wattanx
0
120
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
180
Goの型安全性で実現する複数プロダクトの権限管理
ishikawa_pro
2
1.4k
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
180
メッセージングを利用して時間的結合を分離しよう #phperkaigi
kajitack
3
330
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
100
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
230
ファインチューニングせずメインコンペを解く方法
pokutuna
0
170
Claude Code Skill入門
mayahoney
0
430
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
3
1.9k
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.4k
The free-lunch guide to idea circularity
hollycummins
0
350
Featured
See All Featured
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
140
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.3k
Fireside Chat
paigeccino
42
3.8k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
180
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
HDC tutorial
michielstock
1
590
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
93
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
180
The World Runs on Bad Software
bkeepers
PRO
72
12k
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