【问题标题】:iOS Dependencies injection (typhoon)iOS 依赖注入(台风)
【发布时间】:2016-04-22 14:42:34
【问题描述】:

我发现 tutorial 很好,它展示了依赖注入的工作原理。

但我还是不明白我们需要它的目的是什么?

我可以理解如何使用抽象,但我不明白我们需要以下代码的目的:

- (BNRItemsViewController *)itemsViewController {
  return [TyphoonDefinition withClass:[BNRItemsViewController class] configuration:^(TyphoonDefinition *definition) {
    [definition injectProperty:@selector(itemStore) with:[self store]];
  }];
}

- (id<BNRItemStore>)store {
  return [TyphoonDefinition withClass:[BNRItemStoreImpl class] configuration:^(TyphoonDefinition *definition) {
    [definition useInitializer:@selector(sharedStore) parameters:^(TyphoonMethod *initializer) {
      definition.scope = TyphoonScopeLazySingleton;
    }];
  }];
}

itemsViewController 到底是什么,它是如何被调用的,以及我们如何在不将其设置在外部的情况下获取项目。

注入的主要目标是什么?所以我可以这样做看起来很简单:

BNRItemsViewController *vc = ...
vc.itemStore = [BNRItemStore ...]

使用库对我有什么好处?

【问题讨论】:

    标签: dependency-injection typhoon


    【解决方案1】:

    Typhoon 为您提供了几个优势:

    1) 在以下情况下:

    BNRItemsViewController *vc = ...
    vc.itemStore = [BNRItemStore ...]
    

    您正在手动实例化视图控制器,然后将 itemStore 设置为具体类 (BNItemStore),该类现在已硬编码到该类和任何其他实例化 BNRItemsViewController 的类中。但是 Typhoon 在初始化时会自动注入 itemStore 属性,无论初始化发生在哪里。即使故事板 segue 初始化了 BNRItemsViewController 类(代码中没有手动实例化),它也会从初始化返回,并且 itemStore 属性已经由依赖注入框架自动设置。并且它将在每个实例化的地方注入相同的值,而您的代码不必每次都将该属性设置为硬编码的具体类。

    2) 您不必在一处或多处更改您的代码来更改将 BNRItemStore 协议的具体实现传递给 BNRItemsViewController。相反,您可以在 info.plist 中定义整个应用程序中将发生的具体注入集,您可以在其中指定将使用的 Typhoon 程序集。这意味着您可以拥有一个测试程序集、一个暂存程序集、一个生产程序集,并在整个应用程序中注入每个场景所需的所有适当依赖项,从一个位置进行控制,而不是硬编码到您的实际源代码中.换句话说,您可以更改将用于任何给定应用程序构建的依赖关系的整个图表,而无需触及源代码,并且基于应用程序运行的上下文类型(测试、开发、发布等)。 )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2014-06-12
      • 2021-11-18
      • 2013-04-30
      • 2021-11-19
      相关资源
      最近更新 更多