iOS依赖注入(台风)

iOS Dependencies 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 ...]

我使用图书馆有什么好处?

Typhoon 为您提供了几个优势:

1) 如果是:

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

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

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