Slide 1

Slide 1 text

Nowe Dependency Injection w aplikacji Allegro iOS Allegro Tech Live #17 Maciej Piotrowski | MobileCore

Slide 2

Slide 2 text

Clean Build Time (s) 190 88 177 220 250 307 (Jun 2019 - April 2021) 238 59

Slide 3

Slide 3 text

Clean Build Time (s) 190 88 177 220 250 307 (Jun 2019 - April 2021) 238 59 94 moduły

Slide 4

Slide 4 text

Clean Build Time (s) 190 88 177 220 250 307 (Jun 2019 - April 2021) 238 czas kompilacji < 60 s 59 94 moduły

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

./steve focus Cart

Slide 16

Slide 16 text

OLD

Slide 17

Slide 17 text

./steve focus Networking Networking OLD

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

Cart ItemPage Payments SearchEngine Core Lists … Address OLD

Slide 21

Slide 21 text

Cart ItemPage Payments SearchEngine Core Lists … Address Networking .shared OLD

Slide 22

Slide 22 text

Networking NEW

Slide 23

Slide 23 text

Networking Interface Networking NEW

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

func injectOfferPageDependencies() { let container = OfferPage.DependencyContainer.default container.networking = Networking.Adapter.shared !// … } OLD !//Module: Core

Slide 34

Slide 34 text

func injectOfferPageDependencies() { let container = OfferPage.DependencyContainer.default container.networking = Networking.Adapter.shared !// … } OLD !//Module: Core

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

!//Module: Networking NEW

Slide 38

Slide 38 text

import NetworkingInterface !//Module: Networking NEW

Slide 39

Slide 39 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { !//Module: Networking NEW

Slide 40

Slide 40 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func registerImplementations(in registry: Registry) { !//Module: Networking NEW

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

!//Module: OfferPage NEW

Slide 45

Slide 45 text

import NetworkingInterface !//Module: OfferPage NEW

Slide 46

Slide 46 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { !//Module: OfferPage NEW

Slide 47

Slide 47 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func start(with resolver: Resolver) { !//Module: OfferPage NEW

Slide 48

Slide 48 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func start(with resolver: Resolver) { guard let networking = resolver.resolve(type: Networking.self) !//Module: OfferPage NEW

Slide 49

Slide 49 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func start(with resolver: Resolver) { guard let networking = resolver.resolve(type: Networking.self) } } !//Module: OfferPage NEW

Slide 50

Slide 50 text

import NetworkingInterface class ModuleConfiguration: ModuleConfiguring { func start(with resolver: Resolver) { guard let networking = resolver.resolve(type: Networking.self) } } !//Module: OfferPage NEW

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

!//Module: DependencyInjection NEW

Slide 54

Slide 54 text

!//Module: DependencyInjection NEW class DependencyContainer: Registry, Resolver {

Slide 55

Slide 55 text

!//Module: DependencyInjection NEW class DependencyContainer: Registry, Resolver { func register(type: T.Type, service: Any) {

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

!//Module: DependencyInjection NEW class DependencyContainer: Registry, Resolver { }

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

NEW !//Zalety: Nowe Dependency Injection

Slide 60

Slide 60 text

• lżejszy workspace (mniej modułów) NEW !//Zalety: Nowe Dependency Injection

Slide 61

Slide 61 text

• lżejszy workspace (mniej modułów) • zależności międzymodułowe tylko na moduły z interfejsami (protokoły) NEW !//Zalety: Nowe Dependency Injection

Slide 62

Slide 62 text

• lżejszy workspace (mniej modułów) • zależności międzymodułowe tylko na moduły z interfejsami (protokoły) • wstrzykiwanie implementacji interfejsów przez poszczególne moduły NEW !//Zalety: Nowe Dependency Injection

Slide 63

Slide 63 text

• lżejszy workspace (mniej modułów) • zależności międzymodułowe tylko na moduły z interfejsami (protokoły) • wstrzykiwanie implementacji interfejsów przez poszczególne moduły • ekstrakcja potrzebnych typów przez poszczególne moduły NEW !//Zalety: Nowe Dependency Injection

Slide 64

Slide 64 text

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