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
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
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
210
RAGでハマりがちな"Excelの罠"を、データの構造化で突破する
harumiweb
9
2.4k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
370
Unity6.3 AudioUpdate
cova8bitdots
0
110
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
240
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
520
手戻りゼロ? Spec Driven Developmentとは@KAG AI week
tmhirai
1
160
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
390
Claude Code の Skill で複雑な既存仕様をすっきり整理しよう
yuichirokato
1
280
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
300
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
190
株式会社 Sun terras カンパニーデック
sunterras
0
2k
Featured
See All Featured
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
140
Joys of Absence: A Defence of Solitary Play
codingconduct
1
300
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
360
Marketing to machines
jonoalderson
1
5k
Unsuck your backbone
ammeep
672
58k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
660
Google's AI Overviews - The New Search
badams
0
930
Information Architects: The Missing Link in Design Systems
soysaucechin
0
810
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
65
Building the Perfect Custom Keyboard
takai
2
710
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
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