Внедрение зависимостей iOS (тайфун)

Я нашел хорошее руководство, в котором показано, как работает внедрение зависимостей.

Но я так и не могу понять, для каких целей он нам нужен?

Мне было понятно, как использовать абстракцию, но я не понимаю, для каких целей нам нужен этот код ниже:

- (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 ...]

в чем преимущество для меня использования библиотеки?


person Matrosov Alexander    schedule 22.04.2016    source источник


Ответы (1)


Есть пара преимуществ, которые дает вам Тайфун:

1) В случае:

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

вы вручную создаете экземпляр контроллера представления, а затем устанавливаете itemStore в конкретный класс (BNItemStore), который теперь жестко закодирован в этот и любой другой класс, который создает экземпляр BNRItemsViewController. Но Typhoon автоматически внедряет свойство itemStore при инициализации, независимо от того, где происходит эта инициализация. Даже если переход раскадровки инициализирует класс BNRItemsViewController (в вашем коде нет ручного создания экземпляра), он вернется из инициализации со свойством itemStore, уже автоматически установленным инфраструктурой внедрения зависимостей. И оно будет вводиться с одним и тем же значением в каждом месте, где оно создается, и вашему коду не придется каждый раз устанавливать это свойство в жестко запрограммированный конкретный класс.

2) Вам не нужно менять свой код в одном или нескольких местах, чтобы изменить конкретную реализацию протокола BNRItemStore, которая передается в BNRItemsViewController. Вместо этого вы определяете, какой набор конкретных инъекций будет происходить во всем приложении, в вашем info.plist, где вы указываете сборку Typhoon, которая будет использоваться. Это означает, что у вас может быть тестовая сборка, промежуточная сборка, рабочая сборка и все необходимые зависимости, необходимые для каждого из этих сценариев, внедренные в приложение, управляемые из одного места и не жестко закодированные в вашем фактическом исходном коде. . Другими словами, вы можете изменить весь график того, какие зависимости будут использоваться для той или иной сборки вашего приложения, не касаясь исходного кода, и в зависимости от типа контекста, в котором работает приложение (тестирование, разработка, выпуск и т. д.). )

person Daniel Hall    schedule 22.04.2016