gpt4 book ai didi

ios - Swinject 注册 UIViewController 最佳实践

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:33 32 4
gpt4 key购买 nike

此时,在我的项目中,我使用 Swinject(DI 容器)。

如果我有以下层次结构,我想知道如何注册 ViewController:

class RateAnswersBaseVC: UIViewController { }
class RateAnswersDoctorVC: RateAnswersBaseVC { }
class RateAnswersQualityVC: RateAnswersBaseVC { }

如何将自己的权利注册和使用?在我使用第一个选项的项目中,此时我有两个选项,但感觉我们应该使用第二个:)

// ------- 1 --------
container.register(RateAnswersDoctorVC.self) { r in
let vc: RateAnswersDoctorVC = RateAnswersDoctorVC()
self.configureBasicFields(with: vc, container: container, resolver: r)
return vc
}

container.register(RateAnswersQualityVC.self) { r in
let vc: RateAnswersQualityVC = RateAnswersQualityVC()
self.configureBasicFields(with: vc, container: container, resolver: r)
return vc
}

// ------- 2 --------
container.register(RateAnswersBaseVC.self, name: "doctor") { r in
let vc: RateAnswersDoctorVC = RateAnswersDoctorVC()
self.configureBasicFields(with: vc, container: container, resolver: r)
return vc
}

container.register(RateAnswersBaseVC.self, name: "quality") { r in
let vc: RateAnswersQualityVC = RateAnswersQualityVC()
self.configureBasicFields(with: vc, container: container, resolver: r)
return vc
}

如果您解释为什么使用其中一种方法,我将很高兴。

感谢回复

最佳答案

上次我在项目中使用 MVVM 模式。因此,我将应用程序的业务逻辑拆分为模块 - 提供某些功能或业务逻辑的完整代码部分(例如在应用程序中登录、全屏播放视频等)。我为每个模块创建一个 Assembly 对象来配置模块中的依赖项。

class PasswordAssembly: Assembly {
func assemble(container: Container) {
container.register(PasswordViewInterface.self) { (_: Resolver) in
PasswordViewController(nibName: "PasswordViewController", bundle: nil)
}
.initCompleted { resolver, view in
var view = view as PasswordViewInterface
view.viewModel = resolver.resolve(PasswordViewModelInterface.self)
view.router = resolver.resolve(PasswordRouterInterface.self)
}

container.register(PasswordViewModelInterface.self) { (resolver: Resolver) in
return PasswordViewModel(coreModel: resolver.resolve(CoreViewModelInterface.self)!)
}

container.register(PasswordRouterInterface.self) { _ in
return PasswordRouter()
}
.initCompleted { (resolver, router) in
var router = router as PasswordRouterInterface
router.view = resolver.resolve(PasswordViewInterface.self)
router.resolver = container
}
}
}

我还注入(inject)路由器 Resolver (Container) 对象来制作 Router 构建层次结构

protocol PasswordRouterInterface {
var view: PasswordViewInterface! { get set }
var resolver: Resolver! { get set }

func presentFilesListView()
func presentContentView()
}

class PasswordRouter: PasswordRouterInterface {
var view: PasswordViewInterface!
var resolver: Resolver!

func presentFilesListView() {
if let listViewController = resolver.resolve(FilesListViewInterface.self)?.getViewController() {
let navigationController = UINavigationController(rootViewController: listViewController)
view.getViewController().present(navigationController, animated: true) {

}
}
}

func presentContentView() {

}
}

关于ios - Swinject 注册 UIViewController 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43055836/

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