用台风扩展现有对象图
Extent existing objectgraphs with typhoon
假设有几个王国。每个王国都有一座城堡。
现在我想为这个王国之一创造一些骑士。
界面如下所示:
@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]];
}];
}
这显然是错误的。
我想表达的是"please create a knight for my kingdom and if you need a castle (or something else in my kingdom), then use the right one".
我可以用城堡运行时参数来解决这个问题。但事实上,骑士需要这座城堡是一个实现细节。也许未来的骑士实施需要别的东西。
我可以通过以下代码实现我想要的行为:
MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate];
id<TyphoonComponentsPool> objectGraphSharedInstances = [assembly valueForKeyPath:@"factory._objectGraphSharedInstances"];
[objectGraphSharedInstances setObject:castle forKey:@selector(castle)];
[assembly knight];
这不是很优雅,但它解决了这个例子中的问题。
更通用的方法是在工厂中注册自定义 TyphoonComponentsPool,并为其定义相应的范围。
有这方面的计划吗?或者有更好的方法来解决这类问题?
谢谢,费利克斯
以下是使用 Typhoon 当前功能集的方法:
- 定义一个具有范围单例、惰性单例或弱单例的持有者对象。此持有者对象具有可变属性或方法以传递上下文对象。
- 定义use the holder object as a factory.
的其他定义
- 将这些注入任何你需要的东西。
如评论中所述,我们很高兴在 GitHub 跟踪器中探索替代方案 features/enhancements。
假设有几个王国。每个王国都有一座城堡。 现在我想为这个王国之一创造一些骑士。
界面如下所示:
@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]];
}];
}
这显然是错误的。 我想表达的是"please create a knight for my kingdom and if you need a castle (or something else in my kingdom), then use the right one".
我可以用城堡运行时参数来解决这个问题。但事实上,骑士需要这座城堡是一个实现细节。也许未来的骑士实施需要别的东西。
我可以通过以下代码实现我想要的行为:
MiddleAgesAssembly* assembly = [[MiddleAgesAssembly assembly] activate];
id<TyphoonComponentsPool> objectGraphSharedInstances = [assembly valueForKeyPath:@"factory._objectGraphSharedInstances"];
[objectGraphSharedInstances setObject:castle forKey:@selector(castle)];
[assembly knight];
这不是很优雅,但它解决了这个例子中的问题。
更通用的方法是在工厂中注册自定义 TyphoonComponentsPool,并为其定义相应的范围。
有这方面的计划吗?或者有更好的方法来解决这类问题?
谢谢,费利克斯
以下是使用 Typhoon 当前功能集的方法:
- 定义一个具有范围单例、惰性单例或弱单例的持有者对象。此持有者对象具有可变属性或方法以传递上下文对象。
- 定义use the holder object as a factory. 的其他定义
- 将这些注入任何你需要的东西。
如评论中所述,我们很高兴在 GitHub 跟踪器中探索替代方案 features/enhancements。