A FRESH APPROACH TO DI
TOOTHPICK
https://github.com/stephanenicolas/toothpick/
Slide 2
Slide 2 text
ABOUT US
Senior Android Dev @ Groupon
~20 years of Java coding
OSS: Dart, TP, BoundBox, …
STEPHANE NICOLAS
DANIEL MOLINERO REGUERA
Android Dev @ Groupon
Turbulence Ninja
OSS: Dart, TP.
+stephane
@D_Lemures
Slide 3
Slide 3 text
5IF"OESPJE5FBNJT)JSJOH
jobs.groupon.com/careers/
Slide 4
Slide 4 text
THE TALK
WHY DI ?
WHY TOOTHPICK?
TOOTHPICK FEATURES
ADVANCED FEATURES
CONCLUSION
SCOPE
MODULES & BINDINGS
SCOPE TREE
SCOPE SINGLETONS
MVP & STATE PRESERVATION
MULTIPLE ACTIVITIES FLOWS
Slide 5
Slide 5 text
WHY DI ?
Slide 6
Slide 6 text
WHY DI ?
DECOUPLE
Slide 7
Slide 7 text
WHY DI ?
DECOUPLE USES
Slide 8
Slide 8 text
WHY DI ?
DECOUPLE
REUSE
USES
Slide 9
Slide 9 text
WHY DI ?
DECOUPLE
REUSE
USES
USES
USES
Slide 10
Slide 10 text
WHY DI ?
DECOUPLE
REUSE
TEST
USES
USES
USES
Slide 11
Slide 11 text
WHY DI ?
DECOUPLE
REUSE
TEST
USES
USES
USES
MOCK
USES
Slide 12
Slide 12 text
WHY TOOTHPICK?
Slide 13
Slide 13 text
WHY TOOTHPICK?
SIMPLER
Slide 14
Slide 14 text
WHY TOOTHPICK?
SIMPLER
BETTER TEST SUPPORT
Slide 15
Slide 15 text
WHY TOOTHPICK?
SIMPLER
BETTER TEST SUPPORT
EVEN FASTER
Slide 16
Slide 16 text
TOOTHPICK FEATURES
public class SmoothieMachine {
@Inject IceMachine iceMachine;
public void doSmoothie() {
iceMachine.makeIce();
}
}
@Singleton
public class IceMachine {
Foo foo;
@Inject
public IceMachine(Foo foo) {
this.foo = foo;
}
Slide 17
Slide 17 text
TOOTHPICK FEATURES
public class SmoothieMachine {
@Inject IceMachine iceMachine;
public void doSmoothie() {
iceMachine.makeIce();
}
}
@Singleton
public class IceMachine {
Foo foo;
@Inject
public IceMachine(Foo foo) {
this.foo = foo;
}
JSR 330 annotations→nothing new here
Slide 18
Slide 18 text
TOOTHPICK FEATURES
SCOPE
SCOPE
Slide 19
Slide 19 text
TOOTHPICK FEATURES
SCOPE
SCOPE MAKE INJECTIONS
Slide 20
Slide 20 text
TOOTHPICK FEATURES
SCOPE
SCOPE MAKE INJECTIONS
public class MyApplication extends Application {
@Inject Machine machine;
@Override
protected void onCreate() {
super.onCreate();
Scope appScope = Toothpick.openScope(this);
appScope.installModules(…);
Toothpick.inject(this, appScope);
}
}
Slide 21
Slide 21 text
TOOTHPICK FEATURES
SCOPE, MODULES & BINDINGS
SCOPE
Slide 22
Slide 22 text
TOOTHPICK FEATURES
SCOPE, MODULES & BINDINGS
SCOPE
BINDINGS
Slide 23
Slide 23 text
TOOTHPICK FEATURES
SCOPE, MODULES & BINDINGS
SCOPE
BINDINGS
MODULES
TOOTHPICK FEATURES
public class Module extends Module {
public Module() {
bind(Machine.class).toInstance(new Ice Machine());
}
}
SCOPE SINGLETONS
SINGLETONS CAN BE DEFINED IN MODULES
Slide 38
Slide 38 text
TOOTHPICK FEATURES
@Singleton
public class IceMachine {
}
@ActivitySingleton
public class SmoothieMachine {
}
APPLICATION
SCOPE
ACTIVITY
SCOPE
SCOPE SINGLETONS
OR USING ANNOTATIONS
Slide 39
Slide 39 text
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
Slide 40
Slide 40 text
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
Slide 41
Slide 41 text
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
Slide 42
Slide 42 text
APPLICATION
SCOPE
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
ACTIVITY
SCOPE
Slide 43
Slide 43 text
APPLICATION
SCOPE
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
ACTIVITY
SCOPE
Slide 44
Slide 44 text
APPLICATION
SCOPE
PRESENTER
SCOPE
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
ACTIVITY
SCOPE
Slide 45
Slide 45 text
PRESENTER INSTANCE
APPLICATION
SCOPE
PRESENTER
SCOPE
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
ACTIVITY
SCOPE
Slide 46
Slide 46 text
PRESENTER INSTANCE
APPLICATION
SCOPE
PRESENTER
SCOPE
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
Slide 47
Slide 47 text
PRESENTER INSTANCE
APPLICATION
SCOPE
PRESENTER
SCOPE
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
ACTIVITY
SCOPE
Slide 48
Slide 48 text
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
public class MyActivity extends Activity {
@Inject MyPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Scope scope = openScopes(getApplication(),
PresenterSingleton.class,
this);
Toothpick.inject(this, scope);
}
}
Slide 49
Slide 49 text
@PresenterSingleton
public class MyPresenter {
String dealId;
int quantity;
}
PRESENTER
SCOPE
MVP & STATE PRESERVATION
ADVANCED TOOTHPICK FEATURES
Slide 50
Slide 50 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Slide 51
Slide 51 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Purchase Flow
Slide 52
Slide 52 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Purchase Flow
Slide 53
Slide 53 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Slide 54
Slide 54 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Slide 55
Slide 55 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Slide 56
Slide 56 text
ACTIVITY 1
ADVANCED TOOTHPICK FEATURES
ACTIVITY 3
ACTIVITY 2
MULTI ACTIVITY FLOWS
Slide 57
Slide 57 text
APPLICATION
SCOPE
ACTIVITY 1
SCOPE
ADVANCED TOOTHPICK FEATURES
FLOW SCOPE
MULTI ACTIVITY FLOWS
Slide 58
Slide 58 text
APPLICATION
SCOPE
ACTIVITY 1
SCOPE
ADVANCED TOOTHPICK FEATURES
FLOW SCOPE
MULTI ACTIVITY FLOWS
Slide 59
Slide 59 text
APPLICATION
SCOPE
ACTIVITY 1
SCOPE
ADVANCED TOOTHPICK FEATURES
FLOW SCOPE
ACTIVITY 2
SCOPE
MULTI ACTIVITY FLOWS
Slide 60
Slide 60 text
APPLICATION
SCOPE
ACTIVITY 1
SCOPE
ADVANCED TOOTHPICK FEATURES
FLOW SCOPE
ACTIVITY 3
SCOPE
ACTIVITY 2
SCOPE
MULTI ACTIVITY FLOWS
Slide 61
Slide 61 text
APPLICATION
SCOPE
ADVANCED TOOTHPICK FEATURES
FLOW SCOPE
MULTI ACTIVITY FLOWS
Slide 62
Slide 62 text
APPLICATION
SCOPE
ADVANCED TOOTHPICK FEATURES
MULTI ACTIVITY FLOWS
Slide 63
Slide 63 text
ADVANCED TOOTHPICK FEATURES
MVP & STATE PRESERVATION
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);
}
}
Slide 64
Slide 64 text
@FlowSingleton
public class ShoppingCart {
List purchases…
}
FLOW SCOPE
MULTI ACTIVITY FLOWS
ADVANCED TOOTHPICK FEATURES
Slide 65
Slide 65 text
CONCLUSION
QUESTIONS ?
COMMENTS ?
Slide 66
Slide 66 text
CONCLUSION
QUESTIONS ?
COMMENTS ?
Slide 67
Slide 67 text
A FRESH APPROACH TO DI
TOOTHPICK
https://github.com/stephanenicolas/toothpick/
+stephane
@D_Lemures