2017-03-27 66 views
3

在我的项目中的这一点上,我使用Swinject(DI容器)。Swinject注册UIViewController最佳实践

我想知道如何注册的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 
} 

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

感谢您的答复

回答

0

UMH,无论是1或2,你还在注册实例。 在这种情况下我没有看到任何区别。

这些ViewControllers这样的事情是一个比较复杂一点,但什么会有所作为。将不会登记他们作为RateAnswersBaseVC,但作为一个协议RateAnswersBaseVCServiceRateAnswersBaseVCProtocol,这样你可以再创建一个不同的实现视图控制器在模拟测试。

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() { 

    } 
}