使用装配容器值得吗?

时间:2018-02-10 10:39:28

标签: swift swinject

我正在使用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)!

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

1 个答案:

答案 0 :(得分:1)

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

  1. 分别为不同功能保留DI代码
  2. 功能不了解最终应用的组合方式(例如DependencyManager
  3. IMO 1.非常直观。 2.较少,但在使用程序集时是免费的,并且为您提供了很大的灵活性 - 例如,您可能希望在多个应用程序(例如网络)中重用该功能。

    使用程序集你会有类似

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

    虽然使用直观的方法可能会非常混乱。