Swift:依赖注入,Factory模式仅创建一次实例

时间:2019-05-18 17:27:23

标签: swift cocoa dependency-injection

我已经写了一个工厂模式(看起来像依赖注入),它可以完美地工作:

protocol Dependency {
    func resolveExtractIcon() -> ExtractIconService
}

class DependencyFactory: Dependency, HasDependencies {

    func resolveExtractIcon() -> ExtractIconService {
        return ExtractIcon()
    }

}


struct DependencyInjector {
    static var dependencies: Dependency = DependencyFactory()

    private init() {}
}

protocol HasDependencies {
    var dependencies: Dependency { get }
}

extension HasDependencies {
    var dependencies: Dependency {
        return DependencyInjector.dependencies
    }
}

在View控制器中,我可以这样称呼它:

class IOSAssetsViewController: NSViewController, HasDependencies {
    private lazy var assetsViewModel: AssetsViewModelService = dependencies.resolveExtractIcon()
}

现在,我想在此设计模式中添加一次创建对象并将其注入所需的视图控制器的可能性。

例如,我有一个与我的项目中的三个视图控制器关联的viewModel,我希望当我在ViewController中修改viewModel时,它们在各处都被修改,因为它们使用相同的实例,即使ViewController很快就不存在创建后,它将使用注入的viewModel和其他视图控制器所做的修改。

我尝试了很多可能性,并设法确保只有视图控制器在创建的同时访问同一实例,但是尚不存在的控制器(要创建的然后访问)一个新对象,而不是由视图控制器更改的对象:

 class DependencyFactory: Dependency, HasDependencies {

    // Below it has allowed me to create a single instance accessible only to the view controller create at the same time
    let resoledAssetsViewModel: AssetsViewModelService = AssetsViewModel(extractIconManager: ExtractIcon())

    func resolveExtractIcon() -> ExtractIconService {
        return ExtractIcon()
    }

}

如何使这种设计模式为注入到viewController中的viewmModel创建单个实例?

就像我在appdelegate中创建viewModel一样,我所有的控制器都通过AppDelegate进行调用并对其进行修改。但是我不想通过App委托来做到这一点,因为它并不漂亮,也不是很好的实践。我想按照我的工厂模式做自己想做的事

谢谢您的帮助:)

0 个答案:

没有答案