用台风扩展现有对象图

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。