Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Toothpick - A fresh approach to DI - Short Version

Toothpick - A fresh approach to DI - Short Version

Presented at GDG East Bay - Samsung office

Daniel Molinero Reguera

September 26, 2017
Tweet

More Decks by Daniel Molinero Reguera

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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
  4. 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);
 } }
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. @Singleton
 public class DealApiClient {
 } @ActivitySingleton
 public class ViewHelper

    {
 } APPLICATION
 SCOPE ACTIVITY
 SCOPE SCOPE SINGLETONS OR USING ANNOTATIONS @D_Lemures | #ToothpickDI REUSING INSTANCES
  11. ACTIVITY 1 ACTIVITY 3 ACTIVITY 2 MULTI ACTIVITY FLOWS Purchase

    Flow @D_Lemures | #ToothpickDI REUSING INSTANCES
  12. APPLICATION SCOPE ACTIVITY 1 SCOPE FLOW SCOPE ACTIVITY 3 SCOPE

    ACTIVITY 2 SCOPE MULTI ACTIVITY FLOWS @D_Lemures | #ToothpickDI REUSING INSTANCES
  13. 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
  14. @FlowSingleton
 public class ShoppingCart {
 List<PurchaseItem> purchases…
 } FLOW SCOPE

    MULTI ACTIVITY FLOWS @D_Lemures | #ToothpickDI REUSING INSTANCES