Swift中的依赖注入

问题描述 投票:0回答:1

我完全爱上了依赖注入。我喜欢它为您提供遵循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

目前,一切正常,但我认为这种方法有很多局限性。您有什么建议吗?

ios iphone swift design-patterns dependency-injection
1个回答
0
投票

是,使用您的方法,您需要将所有应用程序对象注册到一个容器中。同样,您也没有使用泛型来推断您要解析的类型并使容器成为类型安全的。

您可以使用https://github.com/JulianAlonso/Injection,它的类型安全,具有粒度并且是一个非常轻量的库。

© www.soinside.com 2019 - 2024. All rights reserved.