假设有几个王国。每个王国都有一座城堡。现在我想为这个王国之一创造一些骑士。
接口如下所示:
@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]];
}];
}这显然是错误的。我想表达的是“请为我的王国创造一个骑士,如果你需要一座城堡(或我王国中的其他东西),那么就使用right one”。
我可以用城堡运行时争论来解决这个问题。但事实上,骑士需要这座城堡,这是一个实施细节。也许未来的骑士实现还需要别的东西。
我可以通过以下代码实现我想要的行为:
MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate];
id<TyphoonComponentsPool> objectGraphSharedInstances = [assembly valueForKeyPath:@"factory._objectGraphSharedInstances"];
[objectGraphSharedInstances setObject:castle forKey:@selector(castle)];
[assembly knight];这不是很优雅,但它解决了本例中的问题。
一种更普遍的方法是在工厂中注册一个定制的TyphoonComponentsPool,其中包含相应的定义范围。
这个方向有什么计划吗?或者有更好的方法来解决这类问题?
谢谢,费利克斯
发布于 2015-12-11 00:36:49
下面是如何使用Typhoon的当前功能集来完成这一任务:
正如注释中提到的,我们很乐意探索GitHub跟踪器中的其他特性/增强功能。
https://stackoverflow.com/questions/34167321
复制相似问题