我在我的项目中为 DI 使用了很棒的Swinject,但我在没有程序集的情况下使用它(当我开始使用 Swinject 时,还没有程序集)。
我目前的使用模式Containers
是:
class ParentContainer {
private let container: Container
init(parentContainer: Container?) {
container = Container(parent: parentContainer)
container.register....
}
func myTopLevelController() -> MyTopController {
let controller = container.resolve....
controller.container = self // controller holds its container
return controller
}
func childContainer() -> ChildContainer {
return ChildContainer(parentContainer: container)
}
}
class ChildContainer {
private let container: Container
init(parentContainer: Container?) {
....
}
使用该配置:
- 容器只要它们需要存活就可以存活(唯一持有对它们的引用的实体 - VC,可以使用依赖项)
- 我可以停止使用/切换 DI 框架,
Container
甚至用手动构建替换(我的代码不知道任何框架),因为我的代码调用:let topController = ParentContainer().myTopLevelController()
现在我正在尝试申请Assembly
。据我所知,我的容器现在将符合AssemblyType
协议。但我有一些困惑:
- 我应该通过组装而不是通过容器来解决实例吗?
- 方法的目的是
func loaded(resolver: ResolverType)
什么?我应该保留解析器吗?它会导致保留周期吗? - 我想要 TopLevelAssembly,但仍将容器用于叶实体。是否可以将 Assembly 作为容器的父级传递?或者还有其他方法可以实现吗?