Я пытаюсь использовать Swift "Состав протокола" для внедрения зависимости впервые. Существуют различные сообщения в блогах от уважаемых инженеров в этой области, которые поддерживают этот подход, но я не могу получить код для компиляции, когда есть зависимости, зависящие от других зависимостей. Инициализирован экземпляр 1003 *, его нельзя использовать для инициализации дочерних зависимостей, но, наоборот, нельзя создать дочерние зависимости без конкретного экземпляра AllDependencies
.
Курица и яйцо. Рок и трудное место.
Я попытаюсь привести самый простой пример, который я могу ...
protocol HasAppInfo {
var appInfo: AppInfoProtocol { get }
}
protocol AppInfoProtocol {
var apiKey: String { get }
}
struct AppInfo: AppInfoProtocol {
let apiKey: String
}
protocol HasNetworking {
var networking: NetworkingProtocol { get }
}
protocol NetworkingProtocol {
func makeRequest()
}
class Networking: NetworkingProtocol {
typealias Dependencies = HasAppInfo
let dependencies: Dependencies
init(dependencies: Dependencies) {
self.dependencies = dependencies
}
func makeRequest() {
let apiKey = self.dependencies.appInfo.apiKey
// perform request sending API Key
// ...
}
}
class AllDependencies: HasAppInfo, HasNetworking {
let appInfo: AppInfoProtocol
let networking: NetworkingProtocol
init() {
self.appInfo = AppInfo(apiKey: "whatever")
/// **********************************************************
/// *** ERROR: Constant 'self.networking' used before being initialized
/// **********************************************************
self.networking = Networking(dependencies: self)
}
}
Кажется, что возможно решить эту проблему с помощью lazy var
, {get set}
или mutating
зависимостей, но это кажется крайне небезопасным, потому что любой код в вашей системе может изменять ваши зависимости по желанию.
Был бы признателен за понимание того, как другие решают то, что кажется довольно фундаментальной проблемой с этим подходом.
Ссылки