, which enable handling an arbitrary number of dependencies generically.
public func autoRegister<T, each D>(
_ type: T.Type,
lifetime: Lifetime = .transient,
using initializer: @escaping (repeat each D) -> T
) {
register(type, lifetime: lifetime) { r in
initializer(repeat r.resolve((each D).self))
}
}
This allows us to transform our previous example into:
container.autoRegister(One.self, using: OneImpl.init)
container.autoRegister(Two.self, using: TwoImpl.init)
container.autoRegister(Three.self, using: ThreeImpl.init)
container.autoRegister(Example.self, using: Example.init)
Now, each dependency is registered concisely, without repetitive resolve calls. This method greatly reduces boilerplate and makes the code easier to read and maintain, especially as the number of dependencies grows.
In the next post, we will see how to provide arguments only available at runtime when resolving dependencies.
SOCIAL SHARE CARD GENERATOR