У меня есть контейнер зависимостей, который выглядит следующим образом -
public protocol DependencyContainer {
typealias FactoryClosure = (Self) -> AnyObject
func register<Service>(type: Service.Type, closure: @escaping FactoryClosure)
func resolve<Service>(type: Service.Type) -> Service
}
public final class CoreDependencyContainer: DependencyContainer {
private var services: Dictionary<ObjectIdentifier, FactoryClosure> = [:]
public func register<Service>(type: Service.Type, closure: @escaping FactoryClosure) {
services[ObjectIdentifier(type)] = closure
}
public func resolve<Service>(type: Service.Type) -> Service {
if let service = services[ObjectIdentifier(type)]?(self) as? Service {
return service
}
preconditionFailure("Could not resolve service for \(type)")
}
}
У меня есть несколько зарегистрированных служб:
dependencies.register(type: RemoteImageDataLoader.self, closure: { container in
let httpClient = container.resolve(type: HTTPClient.self)
return RemoteImageDataLoader(client: httpClient)
})
Я хочу зарегистрировать 2 службы которые соответствуют абстрактному типу RemoteImageDataLoader
.
dependencies.register(type: RemoteImageDataLoader.self, closure: { container in
let httpClient = container.resolve(type: HTTPClient.self)
return RemoteImageDataLoader(client: httpClient)
})
dependencies.register(type: RemoteImageDataLoader.self, closure: { container in
let httpClient = container.resolve(type: AuthenticatedHTTPClient.self)
return RemoteImageDataLoader(client: httpClient)
})
Это, очевидно, не сработает, поскольку вторая запись заменит первую в словаре services
.
Я пытался создать typealias
использовать вместо этого, однако это не работает.
dependencies.register(type: RemoteImageDataLoader.self, closure: { container in
let httpClient = container.resolve(type: HTTPClient.self)
return RemoteImageDataLoader(client: httpClient)
})
typealias AuthRemoteImageLoader = RemoteImageDataLoader
dependencies.register(type: AuthRemoteImageLoader.self, closure: { container in
let httpClient = container.resolve(type: AuthenticatedHTTPClient.self)
return RemoteImageDataLoader(client: httpClient)
})
Как я могу зарегистрировать 2-ую зависимость в этом случае?
Я бы хотел избежать создания 2 версий RemoteImageDataLoader
единственное отличие - внедренный HTTPClient
экземпляр.