正在使用具有值得的容器的组件

  • 本文关键字:组件 值得 swift swinject
  • 更新时间 :
  • 英文 :


我正在使用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组织代码的好处将开始超过"无开销"系统。保持代码模块化和可重复使用的一种方法是(其他内容(:

  1. 将不同功能的DI代码单独保留
  2. 功能不知道如何将最终应用程序放在一起(例如DependencyManager(

imo 1.非常直观。2.更少,但是使用组件时是免费的,并为您提供了很多灵活性 - 例如,您可能需要在多个应用程序中重复使用该功能(例如网络(。

使用组件,您将拥有

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

在使用直观方法时可能会变得很混乱。

最新更新