我完全爱上了依赖注入。我喜欢它为您提供遵循SOLID原则的可能性,它可以防止意大利面条式代码。我在我的一个Android项目中使用了Dagger,一切都更加干净,模块化和可测试。现在我正在开发一个Swift项目。我想遵循这种设计模式而不使用任何第三方库(由于缺乏当前的代码库和项目承诺)。因此,我决定创建一个自制的实现。
import UIKit
class DependencyContainer {
private var dependencies = [String: AnyObject]()
struct Static {
static var instance: DependencyContainer?
}
static var shared: DependencyContainer {
if Static.instance == nil {
Static.instance = DependencyContainer()
}
return Static.instance!
}
init() {
AppDelegate.print("Dependency container instantiated")
}
func resolve(_ classIdentifier: String) -> AnyObject {
if dependencies[classIdentifier] == nil {
dependencies[classIdentifier] = getClassInstance(classIdentifier)
}
return dependencies[classIdentifier]!
}
private func getClassInstance(_ classIdentifier: String) -> AnyObject {
var instance: AnyObject! = nil
let classInstance = NSClassFromString(classIdentifier) as! NSObject.Type
instance = classInstance.init()
return instance
}
func dispose() {
DependencyContainer.Static.instance = nil
}
}
我需要在其中注入依赖项的位置,如下所示:
dataRepository = DependencyContainer.shared.resolve(NSStringFromClass(DataRepositoryImplementation)) as! DataRepository
目前,一切正常,但我认为这种方法有很多局限性。您有什么建议吗?
是,使用您的方法,您需要将所有应用程序对象注册到一个容器中。同样,您也没有使用泛型来推断您要解析的类型并使容器成为类型安全的。
您可以使用https://github.com/JulianAlonso/Injection,它的类型安全,具有粒度并且是一个非常轻量的库。