SwiftDI the new way to use your dependency in Swift 5.1
SwiftDI it’s a tool for Dependency Injection using @propertyWrapper
. Right now SwiftDI is alpha version. Be careful!
SwiftDI works with Swift 5.1 only and SwiftUI.
Please looks at our demo SwiftDIDemo
!
let container = DIContainer()
DIPart
:class MyAssembly: DIPart {
var body: some DIPart {
// Some Assembly parts place here
}
}
class MyAssembly: DIPart {
var body: some DIPart {
DIRegister(MyService.init)
}
}
you can use as<T>(_ type: T.Type)
for set a new injection identifier:
class MyAssembly: DIPart {
var body: some DIPart {
DIRegister(MyService.init)
.as (MyServiceInput.self)
}
}
DIPart
to the container:
let container = DIContainer(part: MyAssembly())
or
let container = DIContainer()
container.appendPart(MyAssembly())
SwiftDI
:SwiftDI.useContainer(container)
class MyController: UIViewController {
@Injected var service: MyServiceInput
}
Does it! You’re finish setup your DI container.
DIPart
sDIGroup {
// Place you DIParts here
}
DIRegister(MyService.init)
also contains methods lifeCycle()
and as()
SwiftDI also supports SwiftUI
framework.
You can inject your BindableObject
and property automatically connect to view state.
For this magic just use @EnvironmentObservedInject
struct ContentView: View {
@EnvironmentObservedInject var viewModel: ContentViewModel
var body: some View {
HStack {
Text(viewModel.title)
}.onAppear { self.viewModel.getData() }
}
}
For non-mutating view object use @EnvironmentInject
:
struct ContentView: View {
@EnvironmentInject var authService: AuthorizationService
var body: some View {
HStack {
Text("Waiting...")
}.onAppear { self.authService.auth() }
}
}
By default SwiftDI using shared container, but if you wanna pass custom container to view using method inject(container:)
for view:
let container = DIContainer()
let view = HomeView().inject(container: container)
Or if you wanna add some method to container using method environmentInject
:
// SceneDelegate.swift
let window = UIWindow(windowScene: windowScene)
let authService = AuthorizationService(window: window)
let view = HomeView().environmentInject(authService)
// etc
SwiftDI supports object scopes, you can use method lifeCycle
DIRegister(MyService.init)
.lifeCycle(.single)
By default life time for instance is objectGraph
. objectGraph
using Mirror
for get info about nested injectables property and it can be slowly.
SwiftDI using @propertyWrapper
to use power of injection.
@Inject
it’s struct uses SwiftDI.sharedContainer
for resolve objects when value
is call.