Typhoon Inject Property в новый объект

Я начинаю использовать контейнеры DI на iOS и не знаю, как вводить свойство в этом случае:

Представьте, что у нас есть:

Сборка.m

- (ClassA *)classA {
    return [TyphoonDefinition withClass:[ClassA class] configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(url) with:@"http://inject:URL"];
    }];
}

И два класса

Класс А

@interface ClassA : NSObject
@property (nonatomic,readwrite) NSString *url;
@end

Класс B

@interface ClassB : ClassA
@end

А также

ViewController.m

@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

   ClassB *cB = [ClassB new]; 
    NSLog(@"%@",cB.url);
}

Я хочу, чтобы я создавал новый объект с помощью ClassB, все объекты имеют инъекцию со свойством url из моего контейнера DI (сборка). Да, я могу добавить свойство в свой ViewController, и эта инъекция работает нормально, но мне нужно ввести свойство в новый объект.

Может быть, я не понимаю всех принципов, но я должен спросить. Спасибо


person dev.nikolaz    schedule 08.11.2016    source источник


Ответы (1)


Попробуй это.

- (id)classAObject{
    return [TyphoonDefinition withClass:[ClassA class]
                          configuration:^(TyphoonDefinition *definition){
                              [definition injectProperty:@selector(url) with:@"http://inject:URL"];
                          }];
}

- (id)classBObject{
    return [TyphoonDefinition withParent:[self classAObject] class:[ClassB class]];
}

KSTTestAssembly *assembly = [[KSTTestAssembly alloc] init];
[assembly activate];

id classB = [assembly classBObject];

Загрузка Тайфуна

Вы можете загрузить Typhoon и сохранить ссылку на него, как правило, в файле AppDelegate. В других частях приложения мы не хотим получать экземпляр Typhoon напрямую:

  • Мы связываем наше приложение напрямую с Typhoon
  • Это не внедрение зависимостей, его сложно тестировать и т. д.

Вместо этого мы делаем следующее:

  • Вставьте сборку (или одну из сборок в модульной конфигурации) в класс, где она нам нужна. Как только сборка будет активирована, это фактически будет экземпляр TyphoonComponentFactory, изображающий из себя сборку.

  • Он будет служить фабрикой для создания построенного графа объектов.

  • Область действия Typhoon по умолчанию — ObjectGraph. Итак, мы не храним в памяти никаких объектов — только рецепты их создания. Граф объектов создается именно тогда, когда он нам нужен.
  • Таким образом, мы можем переходить от одного графа объектов к другому эффективно и слабо связанным образом.

Пример:

- (RootViewController *)rootController
{
    return [TyphoonDefinition withClass:[RootViewController class] 
    configuration:^(TyphoonDefinition* definition) {
        [definition injectProperty:@selector(assembly)];
    }];
}

документация по этой функции находится здесь< /а>.

Раскадровки:

Если вам нравится использовать раскадровки и Objective-C, вы можете использовать макросы автовставки в своем представлении. контроллеры.

person Nikita Ermolenko    schedule 08.11.2016
comment
да, это имеет смысл и работает, но мне не нравится, что этот объект всегда получается из сборки. Где работа по внедрению зависимостей в этом случае? - person dev.nikolaz; 08.11.2016
comment
@dev.nikolaz Почему тебе это не нравится? Можно использовать сборку (IoC-контейнер) для получения какого-либо объекта. Таким образом, DI - это механизм для внедрения зависимостей (в вашем случае для зависимости от свойства), и он использует IoC-контейнер, который содержит настройки конфигурации. - person Nikita Ermolenko; 08.11.2016
comment
да вы правы, это для настроек конфигурации)) и на данный момент это правильный ответ. Большое спасибо! - person dev.nikolaz; 08.11.2016
comment
@dev.nikolaz Добавлены некоторые подробности о том, где хранить экземпляр Typhoon и как избежать прямой связи с ним, например, в контроллерах представления. //@NikkitaErmolenko Спасибо за ответ! - person Jasper Blues; 09.11.2016