Предположим, что существует несколько королевств. В каждом королевстве есть замок. Теперь я хочу создать некоторых рыцарей для одного из этих королевств.Расширение существующих объектовграфики с тайфуном
интерфейсов выглядеть следующим образом:
@interface Castle : NSObject
@end
@interface Kingdom : NSObject
@property(nonatomic, strong)Castle *castle;
@end
@interface Knight : NSObject
@property(nonatomic, strong)Castle *address;
@end
Фактическая внутренняя реализация рыцарей требуют ссылок на замок. Вот мое определение:
-(Knight *)knight
{
[TyphoonDefinition withClass:[Knight class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(address) with:[self castle]];
}];
}
Это очевидно неправильно. Что я хочу выразить: «Пожалуйста, создайте рыцаря для своего королевства, и если вам нужен замок (или что-то еще в моем королевстве), используйте справа».
Я мог бы преодолеть эту проблему с помощью аргумента run-runtime. Но тот факт, что рыцарь нуждается в этом замке, является детальностью реализации. Возможно, будущие реализации рыцарей нуждаются в чем-то другом.
я могу добиться поведения я хочу с помощью следующего кода:
MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate];
id<TyphoonComponentsPool> objectGraphSharedInstances = [assembly valueForKeyPath:@"factory._objectGraphSharedInstances"];
[objectGraphSharedInstances setObject:castle forKey:@selector(castle)];
[assembly knight];
Это не очень элегантно, но это решает проблему в этом примере.
Более общий подход заключается в регистрации пользовательского TyphoonComponentsPool на заводе с соответствующими областями для определений.
Есть ли планы в этом направлении? Или, может быть, есть лучший способ решить такие проблемы?
Спасибо, Феликс