4

此时在我的项目中,我使用 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
}

如果您解释为什么使用一种或另一种方法,我会很高兴。

感谢您的回复

4

2 回答 2

0

嗯,无论是 1 还是 2,您仍在注册一个实例。在这种情况下,我真的没有看到任何区别。

这些是 ViewController,所以事情有点复杂,但不同之处在于将它们注册为RateAnswersBaseVC,而不是作为协议注册RateAnswersBaseVCServiceRateAnswersBaseVCProtocol这样您就可以在模拟中创建 View Controller 的不同实现以进行测试。

于 2017-07-25T16:07:48.173 回答
0

上次我在我的项目中使用 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
        }
    }
}

我还注入路由器Resolver(容器)对象以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() {

    }
}
于 2017-09-03T17:57:55.430 回答