Внедрение зависимостей 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 ...]
В чем преимущество использования библиотеки?
1 ответ
Тайфун дает вам несколько преимуществ:
1) В случае:
BNRItemsViewController *vc = ...
vc.itemStore = [BNRItemStore ...]
вы вручную создаете экземпляр контроллера представления, а затем устанавливаете для itemStore конкретный класс (BNItemStore), который теперь жестко запрограммирован в этом и любом другом классе, который создает экземпляр BNRItemsViewController. Но Typhoon вводит свойство itemStore автоматически при инициализации, независимо от того, где происходит эта инициализация. Даже если сценарий segue инициализирует класс BNRItemsViewController (в вашем коде нет ручного создания экземпляра), он вернется из инициализации со свойством itemStore, уже автоматически установленным каркасом внедрения зависимостей. И оно будет вводиться с тем же значением в каждом месте, где оно создается, без того, чтобы ваш код каждый раз устанавливал это свойство в жестко заданный конкретный класс.
2) Вам не нужно менять код в одном или нескольких местах, чтобы изменить конкретную реализацию протокола BNRItemStore, передаваемую в BNRItemsViewController. Вместо этого вы определяете, какой набор конкретных инъекций будет происходить во всем приложении в вашем файле info.plist, где вы указываете сборку Typhoon, которая будет использоваться. Это означает, что вы можете иметь тестовую сборку, промежуточную сборку, сборку prod и иметь все необходимые зависимости, необходимые для каждого из этих сценариев, внедренные в приложение, управляемые из одного места и не жестко запрограммированные в вашем фактическом исходном коде., Другими словами, вы можете изменить весь график того, какие зависимости будут использоваться для любой данной сборки вашего приложения, не затрагивая исходный код и основываясь на том, в каком типе контекста работает приложение (test, dev, release и т. Д.).)