我在我的项目中使用了很棒的Swinject用于DI,但我在没有程序集的情况下使用它(当我开始使用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?) {
....
}
使用该配置:
Container
,即使是手动构建(我的代码也不知道任何框架),我的代码调用:let topController = ParentContainer().myTopLevelController()
现在我正在尝试应用Assembly
。据我所知,我的容器现在将符合AssemblyType
协议。但我有些困惑:
func loaded(resolver: ResolverType)
方法的目的是什么?我应该保留解析器吗?它会导致保留周期吗?答案 0 :(得分:2)
<强> 1。我应该通过汇编而不是通过容器解决实例吗?
您是否使用装配功能取决于您。使用to manage grouping of dependencies。由于您看起来已经按ParentContainer
和ChildContainer
管理了依赖关系组,因此我认为您不必使用程序集。
使用过Typhoon的用户可能更喜欢该功能。使用了另一个register
/ resolve
类型DI容器的人可能更喜欢自己组织容器结构。
<强> 2。 func加载(解析器:ResolverType)方法的目的是什么?我应该保留解析器吗?它能导致保留周期吗?
在将所有程序集应用于容器之后调用它,以便执行在assemble
的{{1}}方法期间无法运行的内容。它由Swinject系统调用,如UIKit系统调用的Assembly
viewDidLoad
。 The documentation about loaded
或a unit test可能有助于您了解UIViewController
功能。
您不应存储loaded
参数。 (实际上我没有看到用于存储它的用例,因为resolver
没有保留对程序集的引用,这些程序集将在您实例化Assembler
后释放。即使您存储它,也不会保留循环是由。)
<强> 3。我想要使用TopLevelAssembly,但仍然使用容器来获取叶子权限。是否可以将Assembly作为容器的父级传递?或者还有其他方法可以实现吗?
我没有抓住关于TopLevelAssembly和leaf实体的上下文。如果您添加更多详细信息,我将在稍后更新我的答案。
以下是对问题部分的一些评论:您无法传递Assembler
个实例,因为Assembly
的初始值设定项为Container
,它采用init(parent: Container? = nil)
的实例。实现它的另一种方法可能是将顶级保持为Container
。 (或者我必须更新Swinject以支持该方案。)
我的回答可能不完美,但我希望它可以帮助您实现服务定位器模式。