Иерархия сборок тайфунов
Можно ли иметь сборку для определения базовой конфигурации и подкласса для получения дополнительных конфигураций?
Я пытаюсь что-то вроде этого:
@interface RootAssembly : TyphoonAssembly
- (id)abstractObject;
- (id)object;
@end
@implementation RootAssembly
- (id)abstractObject {
return [TyphoonDefinition withClass:[NSObject class]];
}
- (id)object {
return [TyphoonDefinition withParent:[self abstractObject] class:[NSObject class]];
}
@end
@interface ChildAssembly : RootAssembly @end
@implementation ChildAssembly
- (id)object {
return [TyphoonDefinition withParent:[super abstractObject] class:[NSObject class]];
}
@end
Все работает нормально, если используется только одна сборка. Если также создан и активирован второй, метод, возвращающий object
еще не выпил и пытается создать определение, что приводит к исключению:
2015-05-27 18:44:37.542 Typho[17693:8488013] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Only TyphoonDefinition object can be set as parent. But in method '(null)' object of class NSObject set as parent'
см. больше здесь: https://gist.github.com/oettam/01ac812c040ed28d913c
Это действительно путь?
1 ответ
Вы можете определить любой подкласс сборки, который будет действовать как оригинал, или даже другой класс, если он отвечает на те же сообщения. Точно так же, если ваши совместные сборки поддерживаются протоколом, вы можете сказать Typhoon, что реализация этого происходит при запуске.
Рассматривать:
@interface ApplicationAssembly : TyphoonAssembly
//A collaborating assembly
@property(nonatomic, strong, readonly) KernelProvider *kernelProvider;
@end
@implementation ApplicationAssembly
- (SomeViewController*)viewController
{
return [TyphoonDefinition withClass:[SomeViewController class]
configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(something) with:_kernelProvider.service];
];
}
В качестве стартапа вы можете предоставить любую реализацию KernelProvider
что тебе нравится.
ApplicationAssembly *assembly = [[ApplicationAssembly new]
activateWithCollaboratingAssemblies:@[TestKernelProvider new]];
В выводе вы увидите журнал Тайфун:
TestKernelProvider will act in place of [KernelProvider class];
То же самое относится и к стилю интеграции plist при загрузке Typhoon. Просто объявите конкретную реализацию каждой сборки в списке.
Это то, что вы хотите сделать? Я не уверен, что происходит в приведенном выше примере, но если вы покажете мне, как вы запускаете "Тайфун", тогда я могу посмотреть на это для вас.