Swinject:迁移到程序集

时间:2016-01-11 07:05:54

标签: ios dependency-injection swinject

我在我的项目中使用了很棒的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?) {
    ....
}

使用该配置:

  • 容器只要它们需要存在就会存活(唯一一个持有它们的实体 - VC,可以使用依赖项)
  • 我可以停止使用/切换DI框架并替换Container,即使是手动构建(我的代码也不知道任何框架),我的代码调用:let topController = ParentContainer().myTopLevelController()

现在我正在尝试应用Assembly。据我所知,我的容器现在将符合AssemblyType协议。但我有些困惑:

  1. 我应该通过汇编解决实例,而不是通过容器吗?
  2. func loaded(resolver: ResolverType)方法的目的是什么?我应该保留解析器吗?它会导致保留周期吗?
  3. 我想要TopLevelAssembly,但仍然使用容器来获取叶子权限。是否可以将Assembly作为容器的父级传递?或者还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:2)

<强> 1。我应该通过汇编而不是通过容器解决实例吗?

您是否使用装配功能取决于您。使用to manage grouping of dependencies。由于您看起来已经按ParentContainerChildContainer管理了依赖关系组,因此我认为您不必使用程序集。

使用过Typhoon的用户可能更喜欢该功能。使用了另一个register / resolve类型DI容器的人可能更喜欢自己组织容器结构。

<强> 2。 func加载(解析器:ResolverType)方法的目的是什么?我应该保留解析器吗?它能导致保留周期吗?

在将所有程序集应用于容器之后调用它,以便执行在assemble的{​​{1}}方法期间无法运行的内容。它由Swinject系统调用,如UIKit系统调用的Assembly viewDidLoadThe documentation about loadeda unit test可能有助于您了解UIViewController功能。

您不应存储loaded参数。 (实际上我没有看到用于存储它的用例,因为resolver没有保留对程序集的引用,这些程序集将在您实例化Assembler后释放。即使您存储它,也不会保留循环是由。)

<强> 3。我想要使​​用TopLevelAssembly,但仍然使用容器来获取叶子权限。是否可以将Assembly作为容器的父级传递?或者还有其他方法可以实现吗?

我没有抓住关于TopLevelAssembly和leaf实体的上下文。如果您添加更多详细信息,我将在稍后更新我的答案。

以下是对问题部分的一些评论:您无法传递Assembler个实例,因为Assembly的初始值设定项为Container,它采用init(parent: Container? = nil)的实例。实现它的另一种方法可能是将顶级保持为Container。 (或者我必须更新Swinject以支持该方案。)

我的回答可能不完美,但我希望它可以帮助您实现服务定位器模式。