Files
Dip/SampleApp/DipSampleApp/DependencyContainers.swift
2016-09-11 11:07:01 +02:00

76 lines
2.9 KiB
Swift

//
// DependencyContainers.swift
// Dip
//
// Created by Olivier Halligon on 10/10/2015.
// Copyright © 2015 AliSoftware. All rights reserved.
//
import Foundation
import Dip
// MARK: Configuration
/* Change this to toggle between real and fake data */
private let FAKE_PERSONS = false
private let FAKE_STARSHIPS = false
/* ---- */
enum DependencyTags: Int, DependencyTagConvertible {
case Hardcoded
case Dummy
}
// MARK: Dependency Container for Providers
func configure(container dip: DependencyContainer) {
// Register the NetworkLayer, same for everyone here (but we have the ability to register a different one for a specific WebService if we wanted to)
dip.register(.singleton) { URLSessionNetworkLayer(baseURL: "http://swapi.co/api/")! as NetworkLayer }
if FAKE_PERSONS {
// 1) Register fake persons provider
//Here we use constructor injection for one of the dependencies property injection for another, and we provide dependencies manually
dip.register() { FakePersonsProvider(dummyProvider: DummyPilotProvider()) as PersonProviderAPI }
.resolvingProperties { (_, resolved: PersonProviderAPI) in
//here we resolve optional dependencies
//see what happens when you comment this out
(resolved as! FakePersonsProvider).plistProvider = PlistPersonProvider(plist: "mainPilot")
}
} else {
// 1) Register the SWAPIPersonProvider (that hits the real swapi.co WebService)
// Here we use constructor injection again, but let the container to resolve dependency for us
dip.register() { SWAPIPersonProvider(webService: try dip.resolve()) as PersonProviderAPI }
}
if FAKE_STARSHIPS {
// 2) Register fake starships provider
//Here we register different implementations for the same protocol using tags
dip.register(tag: DependencyTags.Hardcoded) { HardCodedStarshipProvider() as StarshipProviderAPI }
//Here we register factory that will require a runtime argument
dip.register(tag: DependencyTags.Dummy) { DummyStarshipProvider(pilotName: $0) as StarshipProviderAPI }
//Here we use constructor injection, but instead of providing dependencies manually container resolves them for us
dip.register() {
FakeStarshipProvider(
dummyProvider: try dip.resolve(tag: DependencyTags.Dummy, arguments: "Main Pilot"),
hardCodedProvider: try dip.resolve(tag: DependencyTags.Hardcoded)) as StarshipProviderAPI
}
} else {
// 2) Register the SWAPIStarshipProvider (that hits the real swapi.co WebService)
// Here we use constructor injection again, but let the container to resolve dependency for us
dip.register() { SWAPIStarshipProvider(webService: try dip.resolve()) as StarshipProviderAPI }
}
}