Slide 1

Slide 1 text

!ZPJDIJUHZ Dependency Injection in Practice Yoichi Tagaya iOSCon 2017, London

Slide 2

Slide 2 text

!ZPJDIJUHZ Yoichi Tagaya w J04&OHJOFFSBU w $$.BSLFUQMBDFBQQ "WBJMBCMFJO .%PXOMPBETJOUPUBM w )JSJOHJO 4BO'SBODJTDP -POEPO 5PLZP ! " # !"#

Slide 3

Slide 3 text

!ZPJDIJUHZ An Author of Swinject • Dependency Injection framework for Swift • Maintained by 5 members • 1.4k+ stars on GitHub • Supporting iOS, macOS, tvOS, watchOS and Linux • 4 extensions provided • github.com/Swinject/Swinject

Slide 4

Slide 4 text

!ZPJDIJUHZ Dependency Injection in Practice 1. Basic Concepts 2. Dependency Injection Container 3. Cake Pattern 5PEBZT5BML

Slide 5

Slide 5 text

!ZPJDIJUHZ What's Dependency Injection

Slide 6

Slide 6 text

!ZPJDIJUHZ What's Dependency Injection Inversion of Control for resolving dependencies You create what you use. ↺ What you use are created and passed.

Slide 7

Slide 7 text

!ZPJDIJUHZ What's Dependency Injection Inversion of Control for resolving dependencies You create what you use. ↺ What you use are created and passed. - Initializer Injection (Constructor Injection) - Property Injection - Method Injection Three ways to pass a dependency instance

Slide 8

Slide 8 text

!ZPJDIJUHZ Tight Coupling / Loose Coupling Tight Coupling *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN OFUXPSL pMFTZTUFN EBUFUJNF SBOEPNOVN

Slide 9

Slide 9 text

!ZPJDIJUHZ Tight Coupling / Loose Coupling Tight Coupling *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN OFUXPSL pMFTZTUFN EBUFUJNF SBOEPNOVN Hard to test

Slide 10

Slide 10 text

!ZPJDIJUHZ Tight Coupling / Loose Coupling Tight Coupling Loose Coupling *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN OFUXPSL pMFTZTUFN EBUFUJNF SBOEPNOVN *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN *OUFSGBDF 1SPUPDPM Hard to test

Slide 11

Slide 11 text

!ZPJDIJUHZ Tight Coupling / Loose Coupling Tight Coupling Loose Coupling *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN OFUXPSL pMFTZTUFN EBUFUJNF SBOEPNOVN *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN *OUFSGBDF 1SPUPDPM .PDL Hard to test

Slide 12

Slide 12 text

!ZPJDIJUHZ Tight Coupling / Loose Coupling Tight Coupling Loose Coupling *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN OFUXPSL pMFTZTUFN EBUFUJNF SBOEPNOVN *NQMFNFOUBUJPO $PODSFUF5ZQF &YUFSOBM4ZTUFN *OUFSGBDF 1SPUPDPM .PDL Hard to test Easy to test

Slide 13

Slide 13 text

!ZPJDIJUHZ More about Motivation of Dependency Injection IUUQTTLJMMTNBUUFSDPNTLJMMTDBTUTBSDIJUFDUJOHBMJWFBQQT

Slide 14

Slide 14 text

!ZPJDIJUHZ Dependency Injection Container (DI Container)

Slide 15

Slide 15 text

!ZPJDIJUHZ Problem of Dependency Injection At the beginning... Dependency Injection Code let a = A(b: B()) " Dependency #

Slide 16

Slide 16 text

!ZPJDIJUHZ Problem of Dependency Injection Soon... " Dependency # let a = A(b: B(c: C())) $ Dependency Dependency Injection Code

Slide 17

Slide 17 text

!ZPJDIJUHZ let a = A(b: B(c: C(f: F()), e: E(f: F()))) Problem of Dependency Injection Much later... $ ' * & # ) " % ( Hard to manage Dependency Injection Code

Slide 18

Slide 18 text

!ZPJDIJUHZ Dependency Injection Container $ ' * & # ) " % ( %*$POUBJOFS Dependency Graph Register the dependency graph let a = ... Resolve dependencies upon your request

Slide 19

Slide 19 text

!ZPJDIJUHZ Demo Implement a Container 4JNQMF%*$POUBJOFS%FNPIUUQCJUMZPKV 4XJOKFDU%FNPIUUQCJUMZO%[(G7 &%*51MBZHSPVOEQSPHSBNTBSFBWBJMBCMFBU(JU)VC(JTU

Slide 20

Slide 20 text

!ZPJDIJUHZ Dependency Injection Container Pros and Cons • Pros - It's easy to use. - Definitions are in a single place.

Slide 21

Slide 21 text

!ZPJDIJUHZ Dependency Injection Container Pros and Cons • Cons &%*51PTTJCMFSVOUJNFFSSPSDBVTFECZGPSDFVOXSBQQJOH

Slide 22

Slide 22 text

!ZPJDIJUHZ Cake Pattern: Statically Defined Dependency Injection

Slide 23

Slide 23 text

!ZPJDIJUHZ Cake Pattern: Statically Defined Dependency Injection "CTUSBDU $PNQPOFOU "CTUSBDU $PNQPOFOU 1SPUPDPM %FpOFTQMBDFIPMEFS GPSEFQFOEFODZ

Slide 24

Slide 24 text

!ZPJDIJUHZ Cake Pattern: Statically Defined Dependency Injection "CTUSBDU $PNQPOFOU "CTUSBDU $PNQPOFOU $PODSFUF $PNQPOFOU $PODSFUF $PNQPOFOU 1SPUPDPM 1SPUPDPM %FpOFTQMBDFIPMEFS GPSEFQFOEFODZ %FpOFTEFQFOEFODZ

Slide 25

Slide 25 text

!ZPJDIJUHZ Cake Pattern: Statically Defined Dependency Injection "CTUSBDU $PNQPOFOU "CTUSBDU $PNQPOFOU $POUFYU $PODSFUF $PNQPOFOU $PODSFUF $PNQPOFOU 1SPUPDPM 1SPUPDPM $MBTT4USVDU&OVN %FpOFTQMBDFIPMEFS GPSEFQFOEFODZ %FpOFTEFQFOEFODZ $PNCJOFTEFQFOEFODZ EFpOJUJPOT

Slide 26

Slide 26 text

!ZPJDIJUHZ Demo Try Cake Pattern $BLF1BUUFSO%FNPIUUQCJUMZO%RG/K &%*51MBZHSPVOEQSPHSBNJTBWBJMBCMFBU(JU)VC(JTU

Slide 27

Slide 27 text

!ZPJDIJUHZ Cake Pattern Pros and Cons • Pros - Lack of definitions checked by compiler. • Cons - Less easy than DI container. %FQFOEFODZ*OKFDUJPOXJUIUIF$BLF1BUUFSOJO4XJGUCZ#PC$PUUSFMM
 IUUQBDRVJIJSFNFEFQFOEFODZJOKFDUJPOXJUIUIFDBLFQBUUFSOJOTXJGU (SFBUBSUJDMFUPMFBSO$BLF1BUUFSO

Slide 28

Slide 28 text

!ZPJDIJUHZ Summary • Basic Concepts - Inversion of Control - Tight/loose coupling • Dependency Injection Container - Easy but possible error at runtime • Cake Pattern - Difficult but safe at runtime