Mic*_*sen 5 design-patterns dependency-injection swift
我写了一个工厂模式(看起来像依赖注入),它可以完美地工作:
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
}
}
Run Code Online (Sandbox Code Playgroud)
在我的View控制器中,我可以这样称呼它:
class IOSAssetsViewController: NSViewController, HasDependencies {
private lazy var assetsViewModel: AssetsViewModelService = dependencies.resolveExtractIcon()
}
Run Code Online (Sandbox Code Playgroud)
现在,我想在此设计模式中添加一次创建对象并将其注入到所需的视图控制器中的可能性。
例如,我有一个与我的项目中的三个视图控制器关联的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()
}
}
Run Code Online (Sandbox Code Playgroud)
如何使这种设计模式为注入到viewController中的viewmModel创建单个实例?
就像我在appdelegate中创建viewModel一样,我所有的控制器都通过AppDelegate进行调用并对其进行修改。但是我不想通过App委托来做到这一点,因为它并不漂亮,也不是很好的实践。我想按照我的工厂模式做我想做的事
谢谢您的帮助 :)