iOS依赖注入(台风)

时间:2016-04-22 14:42:34

标签: dependency-injection typhoon

我找到了很好的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 ...]

使用库有什么好处?

1 个答案:

答案 0 :(得分:1)

Typhoon为您提供了几个优势:

1)在以下情况下:

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

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

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