我正在使用swinject进行依赖注入。我创建了一个具有容器的共享实例的依赖项。
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类实施汇编
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
})
}
}
我阅读了汇编文档,其中说它可以更好地用于组织-https://github.com/swinject/swinject/swinject/blob/master/master/documentation/assembler.md。如果我没有使用汇编,那么我将使用
之类的命令 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
组织代码的好处将开始超过"无开销"系统。保持代码模块化和可重复使用的一种方法是(其他内容(:
- 将不同功能的DI代码单独保留
- 功能不知道如何将最终应用程序放在一起(例如
DependencyManager
(
imo 1.非常直观。2.更少,但是使用组件时是免费的,并为您提供了很多灵活性 - 例如,您可能需要在多个应用程序中重复使用该功能(例如网络(。
使用组件,您将拥有
之类的东西let assembler = Assembler([
LoginAssembly(), // each assembly contains DI code for one feature
HomepageAssembly(),
UserProfileAssembly(),
// ...
])
在使用直观方法时可能会变得很混乱。