我正在使用Swinject进行依赖注入。我创建了一个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
})
}
}
我阅读了汇编文档,其中说它更适合用于组织 - https://github.com/Swinject/Swinject/blob/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)!
两种实现都按预期工作,没有任何崩溃。我想知道为什么大会甚至是一个优势?我在没有使用程序集而没有开销的情况下做同样的事情。
答案 0 :(得分:1)
一旦项目变得足够大,使用Assembly
组织代码的好处将开始超过“无开销”系统。保持代码模块化和可重用的一种方法是(除其他外):
DependencyManager
)IMO 1.非常直观。 2.较少,但在使用程序集时是免费的,并且为您提供了很大的灵活性 - 例如,您可能希望在多个应用程序(例如网络)中重用该功能。
使用程序集你会有类似
的东西let assembler = Assembler([
LoginAssembly(), // each assembly contains DI code for one feature
HomepageAssembly(),
UserProfileAssembly(),
// ...
])
虽然使用直观的方法可能会非常混乱。