gpt4 book ai didi

ios - Swinject:迁移到程序集

转载 作者:行者123 更新时间:2023-12-01 18:47:07 26 4
gpt4 key购买 nike

我正在使用很棒的 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协议(protocol)。但我有一些困惑:
  • 我应该通过组装而不是通过容器来解决实例吗?
  • func loaded(resolver: ResolverType)的目的是什么方法?我应该保留解析器吗?它会导致保留周期吗?
  • 我想要 TopLevelAssembly,但仍将容器用于叶实体。是否可以将 Assembly 作为容器的父级传递?或者还有其他方法可以实现吗?
  • 最佳答案

    1.我应该通过组装而不是通过容器来解决实例吗?

    是否使用装配功能取决于您。使用 to manage grouping of dependencies .因为看起来你已经通过 ParentContainer 管理了依赖组。和 ChildContainer ,我认为您不必使用程序集。

    用过Typhoon的人可能更喜欢该功能。用过其他人register/resolve类型 DI 容器可能更喜欢自己组织容器结构。

    2. func loaded(resolver: ResolverType) 方法的作用是什么?我应该保留解析器吗?它会导致保留周期吗?

    在将所有程序集应用到容器后调用它,以执行在 assemble 期间无法运行的操作。 Assembly 的方法.它被 Swinject 系统调用,如 viewDidLoadUIViewController由 UIKit 系统调用。 The documentation about loaded a unit test可能有助于您理解 loaded功能。

    您不应该存储 resolver范围。 (实际上我没有看到存储它的用例,因为 Assembler 不保留对程序集的引用,这些引用将在您实例化后释放 Assembler 。即使您存储它,也不会导致保留周期。)

    3. 我想要 TopLevelAssembly,但仍然使用容器作为叶实体。是否可以将 Assembly 作为容器的父级传递?或者还有其他方法可以实现吗?

    我没有了解您关于 TopLevelAssembly 和叶实体的上下文。如果您添加更多详细信息,我将能够稍后更新我的答案。

    以下是对问题部分的一些评论:您不能通过 Assembly实例因为 Container 的初始化程序是 init(parent: Container? = nil) ,它采用 Container 的实例.实现它的另一种方法可能是将顶层保持为 Container . (或者我必须更新 Swinject 以支持该场景。)

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

    关于ios - Swinject:迁移到程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715871/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com