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

Dependency Injection on iOS

Dependency Injection on iOS

Amanjeet Singh

October 20, 2018
Tweet

More Decks by Amanjeet Singh

Other Decks in Programming

Transcript

  1. Dependency
    To inject or not?

    View full-size slide

  2. 3
    Agenda
    • The problems in your code base
    • The solution (sort of) : Dependency Injection
    • What, why and how of Dependency Injection
    • Introduction to Swinject and Weaver
    • Wrap up

    View full-size slide

  3. What is the problem
    in your code base?

    View full-size slide

  4. “Spaghetti Code”
    Spaghetti code phrase for unstructured and difficult to
    maintain source code. It can be caused by volatile project
    requirements, and insufficient ability or experience.

    View full-size slide

  5. “Unmaintainable Codebase”

    View full-size slide

  6. “Non testable code”

    View full-size slide

  7. “Difficulty for fellow peers”

    View full-size slide

  8. Nobody wants that right?
    $

    View full-size slide

  9. Enter Dependency Injection!

    View full-size slide

  10. DI what?
    Dependency injection is a technique whereby one
    object supplies the dependencies of another object. An
    injection is the passing of a dependency to a dependent
    object. The service is made part of the client's state.

    View full-size slide

  11. Fact
    Dependency Injection is a 25 dollar
    term for a 5 cent concept

    View full-size slide

  12. You’ve already done Dependency Injection,
    unknowingly
    Passing data through Segues, is Dependency
    Injection

    View full-size slide

  13. What DI is NOT ❌
    • a library
    • a framework
    • a tool

    View full-size slide

  14. What DI is ✅
    • a way of thinking
    • a way of designing code
    • general guidelines

    View full-size slide

  15. 3
    Current
    •Initialiser Based
    •Property Based
    •Parameter Based

    View full-size slide

  16. Initialiser Based
    The idea is that an object should be given the
    dependencies it needs when being initialised. The
    benefit is that it guarantees that our objects have
    everything they need in order to work the right
    way.
    This is easy af.

    View full-size slide

  17. Property Based
    Instead of injecting an object’s dependencies in the
    initialiser, properties can simply be assigned
    afterwards. This can also reduce boilerplate code,
    especially when there is stuff that doesn’t need to be
    injected.

    View full-size slide

  18. Parameter Based
    Sometimes we need a specific dependency once,
    or we need to mock it under certain conditions.
    Instead of having to change an object’s init or
    expose properties, we open up an API to accept
    dependency as a parameter.

    View full-size slide

  19. Dependency Container

    A Dependency Injection Container (or DI Container) is
    basically an object able to instantiate, retain, and
    resolve other objects’ dependencies for them.

    View full-size slide

  20. Swinject
    Swinject is a lightweight dependency injection
    framework for Swift. Swinject helps your app split
    loosely-coupled components. Swinject is powered by
    the Swift generic type system and first class functions
    to define dependencies of your app simply.

    View full-size slide

  21. 3
    Why containers?
    • Inject “N” dependencies with one
    parameter
    • Different init logic for different layers
    • With the right interfaces, Unit tests
    are easy
    • Implements Inversion of control

    View full-size slide

  22. 3
    Why not Containers?
    • Can crash at runtime
    • Unit tests need their own containers
    • Not easy, very conceptual

    View full-size slide

  23. Weaver to the Rescue!!

    View full-size slide

  24. What is Weaver?
    Weaver is a lightweight Dependency Injection
    framework that is able to generate the necessary
    boilerplate code to inject dependencies into Swift types,
    based on annotations.

    View full-size slide

  25. Quick Wins
    •Works compile time
    •Container Auto Generation
    •Type and Thread safe
    •ObjC Support

    View full-size slide

  26. 3
    How does it work? ⚒
    • Scans your code for annotations
    • Generates an AST*
    • Generates a Dependency Graph
    • Performs safety checks
    • Generates Boilerplate code using the graph. Generate
    one dependency container/ struct or class with
    injectable dependencies.
    * Abstract Syntax Tree

    View full-size slide

  27. Implementing a MoviesListController
    3 notice worthy objects
    1) AppDelegate, registering the
    dependencies
    2) MovieManager, providing the movies
    3) MoviesListVC , showing the movies

    View full-size slide

  28. Registering Dependencies

    View full-size slide

  29. Defining Scope

    View full-size slide

  30. Building Root View Controller

    View full-size slide

  31. MovieManager

    View full-size slide

  32. Further Reading
    .
    1) Medium Article 

    https://medium.com/@JoyceMatos/dependency-injection-in-
    swift-87c748a167be
    2) Podcast by Cocoacasts 

    https://cocoacasts.com/nuts-and-bolts-of-dependency-injection-in-
    swift
    3) Swinject

    https://github.com/Swinject/Swinject
    4) Weaver 

    https://github.com/scribd/Weaver

    View full-size slide

  33. Amanjeet Singh Bhagat Singh
    @droid_singh @soulful_swift
    Thanks!
    Bobble Keyboard Zomato

    View full-size slide