Slide 1

Slide 1 text

Dependency Injection at scale iOS Conf SG 2022 Maciej Piotrowski | Allegro.pl

Slide 2

Slide 2 text

9+ years iOS development Mobile Core Team @ allegro “I make devs’ lives easier” Maciej Piotrowski

Slide 3

Slide 3 text

20 million customers each month one of top ten most visited e-commerce sites worldwide mobile apps big chunk of traf fi c the most popular product search engine in Poland

Slide 4

Slide 4 text

XcodeGen Bazel Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away steve

Slide 5

Slide 5 text

OVERVIEW: Steve provides you a convenient way to solve daily 👨💻 development problems and complete repetitive tasks. USAGE: steve OPTIONS: --version Shows the version -h, --help Shows help information SUBCOMMANDS: fixme Fixes most common issues that developers encounter generate Allows to generate modules for Allegro app bazel Use this command to invoke Bazel with parameters focus Allows to focus on selected modules from Allegro workspace test Runs tests for the given project and scheme Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away OVERVIEW: Steve provides you a convenient way to solve daily 👨💻 development problems and complete repetitive tasks. USAGE: steve OPTIONS: --version Shows the version -h, --help Shows help information SUBCOMMANDS: fixme Fixes most common issues that developers encounter generate Allows to generate modules for Allegro app bazel Use this command to invoke Bazel with parameters focus Allows to focus on selected modules from Allegro workspace test Runs tests for the given project and scheme

Slide 6

Slide 6 text

./steve generate Networking Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away

Slide 7

Slide 7 text

./steve generate Networking Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away generates a module based on a template

Slide 8

Slide 8 text

January 2021 78 modules 77 standard modules 1 utility module January 2022 91 standard modules 26 utility modules 117 modules

Slide 9

Slide 9 text

how to inject dependencies to ? 117 modules NetworkClient .shared Core Cart ItemPage Payments SearchEngine Lists … Address OLD import Networking import Networking import Networking import Networking import Networking import Networking import Networking

Slide 10

Slide 10 text

Cart ItemPage Payments SearchEngine Lists … Address Networking 
 Interface Networking NEW import NetworkingInterface import NetworkingInterface import NetworkingInterface import NetworkingInterface import NetworkingInterface import NetworkingInterface how to inject dependencies to ? 117 modules

Slide 11

Slide 11 text

Networking 
 Interface Networking NEW public module private module

Slide 12

Slide 12 text

Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away public & private modules generated based on a new template

Slide 13

Slide 13 text

January 2022 91 private modules 91 public modules 26 utility modules January 2021 78 modules 77 standard modules 1 utility module 208 modules

Slide 14

Slide 14 text

we don’t have in our workspace 208 modules

Slide 15

Slide 15 text

The Build of iOS Conf SG 2021: Speeding up the build process of a monolithic application 208 modules

Slide 16

Slide 16 text

./steve focus none Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away

Slide 17

Slide 17 text

./steve focus Cart Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away

Slide 18

Slide 18 text

./steve focus Networking Cart ItemPage Payments SearchEngine Networking Lists … Address OLD

Slide 19

Slide 19 text

Cart ItemPage Payments SearchEngine Lists … Address Networking 
 Interface Networking ./steve focus Networking NEW Networking 
 Interface

Slide 20

Slide 20 text

Cart 
 Interface ItemPage 
 Interface Payments 
 Interface SearchEngine 
 Interface Lists 
 Interface … Address 
 Interface Cart ItemPage Payments SearchEngine Lists … Address NEW

Slide 21

Slide 21 text

Cart 
 Interface ItemPage 
 Interface Payments 
 Interface SearchEngine 
 Interface Lists 
 Interface … Address 
 Interface Cart ItemPage Payments SearchEngine Lists … Address NEW

Slide 22

Slide 22 text

Cart 
 Interface ItemPage 
 Interface Payments 
 Interface SearchEngine 
 Interface Lists 
 Interface … Address 
 Interface Networking 
 Interface Networking Cart ItemPage Payments SearchEngine Lists … Address NEW

Slide 23

Slide 23 text

Media: https://giphy.com/gifs/nervous-indiana-jones-waiting-oKVs1VY0MKfvO

Slide 24

Slide 24 text

Media: https://giphy.com/gifs/cbs-indianajones-harrisonford-raidersofthelostark-TGogvP0s0QESHmyYi9

Slide 25

Slide 25 text

import Networking func injectProductPageDependencies() { let container = ProductPage.DependencyContainer.default container.apiClient = Networking.NetworkClient.shared // … } OLD // Module: Core Media: https://giphy.com/gifs/cbs-indianajones-harrisonford-raidersofthelostark-TGogvP0s0QESHmyYi9

Slide 26

Slide 26 text

protocol NetworkingClient { func get(_ resource: Resource) func post(_ resource: Resource) } OLD // Module: Networking

Slide 27

Slide 27 text

protocol NetworkingClient { func get(_ resource: Resource) func post(_ resource: Resource) } // Module: NetworkingInterface NEW

Slide 28

Slide 28 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func registerImplementations(in registry: Registry) { registry.register(type: NetworkingClient.self, service: NetworkClient()) // Module: Networking NEW

Slide 29

Slide 29 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func registerImplementations(in registry: Registry) { registry.register(type: NetworkingClient.self, service: NetworkClient()) } // Module: Networking NEW Media: https://giphy.com/gifs/cbs-indianajones-harrisonford-raidersofthelostark-TGogvP0s0QESHmyYi9

Slide 30

Slide 30 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func resolveDependencies(with resolver: Resolver) { guard let networking = resolver.resolve(type: NetworkingClient.self) // Module: ProductPage NEW

Slide 31

Slide 31 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func resolveDependencies(with resolver: Resolver) { guard let networking = resolver.resolve(type: NetworkingClient.self) } } // Module: ProductPage NEW Media: https://giphy.com/gifs/cbs-indianajones-harrisonford-raidersofthelostark-TGogvP0s0QESHmyYi9

Slide 32

Slide 32 text

var modules: [ModuleConfiguring.Type] { ProductPage.ModuleConfiguration.self, Networking.ModuleConfiguration.self, / / … } // Module: Application NEW

Slide 33

Slide 33 text

let container: Registry & Resolver = // … modules.forEach { $0.registerImplementations(in: container) } modules.forEach { $0.resolveDependencies(with: container) } // Module: Application NEW

Slide 34

Slide 34 text

// Module: DependencyInjection NEW class DependencyContainer: Registry, Resolver { func register(type: T.Type, service: Any) { dependencies[DependencyKey(type)] = service

Slide 35

Slide 35 text

// Module: DependencyInjection NEW class DependencyContainer: Registry, Resolver { func register(type: T.Type, service: Any) { dependencies[DependencyKey(type)] = service } }

Slide 36

Slide 36 text

// Module: DependencyInjection NEW class DependencyContainer: Registry, Resolver { } func resolve(type: T.Type) -> T? { return dependencies[DependencyKey(type)] as? T }

Slide 37

Slide 37 text

NEW // Summary: New Dependency Injection at scale private public Cart 
 Interface ItemPage 
 Interface Payments 
 Interface SearchEngine 
 Interface Lists 
 Interface … Address 
 Interface Cart ItemPage Payments SearchEngine Lists … Address Media: https://www.macrumors.com/2011/10/05/steve-jobs-has-passed-away

Slide 38

Slide 38 text

NEW // Summary: New Dependency Injection at scale private public Media: https://giphy.com/gifs/cbs-indianajones-harrisonford-raidersofthelostark-TGogvP0s0QESHmyYi9 func application(_:, didFinishLaunchingWithOptions:) -> Bool { modules.forEach { $0.registerImplementations(in: container) } modules.forEach { $0.resolveDependencies(with: container) } }

Slide 39

Slide 39 text

• lighter workspace • light dependency injection framework • intermodule dependencies on public interfaces • private modules inject implementations of interfaces • module extracts what it needs from the dependencies container // Summary: New Dependency Injection at scale Media: https://giphy.com/gifs/cbs-indianajones-harrisonford-raidersofthelostark-TGogvP0s0QESHmyYi9

Slide 40

Slide 40 text

allegro.tech Speeding up iOS builds with Bazel Speeding up warm builds in Xcode Maciej Piotrowski twitter.com/macpiotrowski89 swifting.io

Slide 41

Slide 41 text

https://allegro.tech/2020/12/speeding-up-ios-builds-with-bazel.html https://allegro.tech/2020/12/speeding-up-warm-builds.html https://bazel.build https://github.com/yonaskolb/XcodeGen 
 iOS Conf SG 2021: Speeding up the build process of a monolithic application