在iOS开发中使用依赖注入和快速编程语言

时间:2016-11-03 16:08:03

标签: ios objective-c swift dependency-injection

我是iOS开发的新手。我需要为UIViewController注入注入的依赖项和服务,而不是在init()viewDidLoad()方法中创建它们。看起来像这样:

// Initialize View Controller
let viewController = ViewController()

// Configure View Controller
viewController.requestManager = RequestManager()

我的问题是:

  1. 是否可以在iOS中使用?
  2. 我在哪里创建依赖项和UIViewControllers?
  3. MyUIViewController的外观如何?我应该使用init()方法吗?
  4. 注1:我不使用任何类型的容器。我需要使用纯男人DI。

    注意2:在ASP.NET MVC中,我们所说的内容与IControllerFactory类似。

3 个答案:

答案 0 :(得分:3)

如果您使用UIStoryboardSegue转换到新的视图控制器,则可以在-prepareForSegue:回调中进行设置,包括依赖注入。从故事板加载视图控制器并初始化之后,但在加载任何视图之前,会发生这种情况。例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue {
    MyViewController * vc = (MyViewController *)segue.destinationViewController;
    vc.injectedProperty1 = [InjectedObject new];
    vc.injectedProperty2 = [OtherInjectedObject new];
}

答案 1 :(得分:2)

为了能够将依赖项注入视图控制器,您必须继承UIViewController并创建自定义init函数。

以SO帖子为例: how-do-i-make-a-custom-initializer-for-a-uiviewcontroller

因此,在您的UIViewController子类中,您将拥有一个自定义init,如:

init(requestManager: RequestManager)
{
    self.requestManager = requestManager

    super.init(nibName: nil, bundle: nil)
}

并且您在其中创建MyUIViewController的实例:

let myRequestManager = RequestManager()
let viewController = MyUIViewController(requestManager: myRequestManager)

答案 2 :(得分:2)

BNR书籍没有提及工厂方法的原因是iOS应用程序不会(通常)使用它们来创建视图控制器。如果您是iOS开发的新手,并且沿着这条路走下去,您应该再考虑一下您的应用结构。

最好开始使用故事板,并在呈现视图控制器的prepare(for segue: UIStoryboardSegue)方法中分配属性。 e.g。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let viewController = segue.destination as? MyViewController {
        viewController.requestManager = requestManager
    }
}

虽然您当然可以覆盖必需的init?(coder aDecoder: NSCoder) ...

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    requestManager = RequestManager()
}
相关问题