gpt4 book ai didi

swift - 使用带有容器的程序集值得吗?

转载 作者:搜寻专家 更新时间:2023-11-01 07:04:52 24 4
gpt4 key购买 nike

我正在使用 Swinject 进行依赖注入(inject)。我创建了一个 DependencyManager,它有一个共享的容器实例。

internal class DependencyManager {
private static let sharedInstance = DependencyManager()

private var assembler: Assembler
private let container: Container

class func getResolver() -> Resolver {
return self.sharedInstance.assembler.resolver
}

class func getContainer() -> Container {
return self.sharedInstance.container
}

private init() {
self.container = Container()
let assembler = Assembler([
LoginFactory()
])
self.assembler = assembler
}

LoginFactory 类实现 Assembly

internal class LoginFactory: Assembly {
func assemble(container: Container) {
container.register(LSViewModel.self) { res in
return LSViewModel()
}
container.register(LSCoordinator.self, factory: { res in
let lsc = LSCoordinator(window: AppDelegate.mainWindow!)
lsc.viewModel = res.resolve(LSViewModel.self)
return lsc
})
}

我阅读了 Assembly 文档,其中说它更适合用于组织 - https://github.com/Swinject/Swinject/blob/master/Documentation/Assembler.md .如果我没有使用 Assembly,那么我会使用像这样的命令

        DependencyManager.getContainer().register(LSViewModel.self) { _ in LSViewModel() }
DependencyManager.getContainer().register(LSCoordinator.self, factory: { (res) in
let lsc = LSCoordinator(window: AppDelegate.mainWindow!)
lsc.viewModel = res.resolve(LSViewModel.self)
return lsc
})
let lsCoordinator: LSCoordinator = DependencyManager.getContainer().resolve(LSCoordinator.self)!

两种实现都按预期工作,没有任何崩溃。我想知道为什么 Assembly 甚至是一个优势?我在不使用 Assembly 的情况下做同样的事情。

最佳答案

一旦项目变得足够大,使用 Assembly 组织代码的好处将开始超过“无开销”系统。保持代码模块化和可重用的一种方法是(除其他外):

  1. 分别保存不同功能的DI代码
  2. 功能不知道最终应用程序是如何组合在一起的(例如 DependencyManager)

IMO 1. 非常直观。 2. 较少,但在使用程序集时是免费的,并为您提供了很大的灵 active - 例如,您可能希望在多个应用程序(例如网络)中重用该功能。

使用程序集你会得到类似的东西

let assembler = Assembler([
LoginAssembly(), // each assembly contains DI code for one feature
HomepageAssembly(),
UserProfileAssembly(),
// ...
])

虽然使用直观的方法可能会变得非常困惑。

关于swift - 使用带有容器的程序集值得吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48719823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com