我开始在iOS上使用DI容器,在这种情况下我不知道如何注入属性:
想象一下我们有:
Assembly.m
- (ClassA *)classA {
return [TyphoonDefinition withClass:[ClassA class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(url) with:@"http://inject:URL"];
}];
}
两个班级
ClassA的
@interface ClassA : NSObject
@property (nonatomic,readwrite) NSString *url;
@end
ClassB的
@interface ClassB : ClassA
@end
和
ViewController.m
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
ClassB *cB = [ClassB new];
NSLog(@"%@",cB.url);
}
我想通过ClassB创建新对象的位置,所有对象都注入了我的DI容器(程序集)中的url属性 是的我可以为我的ViewController添加属性,这个注入工作正常,但我需要将属性注入新对象。
也许我不了解所有原则,但我应该问。 THX
答案 0 :(得分:1)
试试这个。
- (id)classAObject{
return [TyphoonDefinition withClass:[ClassA class]
configuration:^(TyphoonDefinition *definition){
[definition injectProperty:@selector(url) with:@"http://inject:URL"];
}];
}
- (id)classBObject{
return [TyphoonDefinition withParent:[self classAObject] class:[ClassB class]];
}
KSTTestAssembly *assembly = [[KSTTestAssembly alloc] init];
[assembly activate];
id classB = [assembly classBObject];
引导台风
你可以引导Typhoon,并持有它的引用,通常在AppDelegate中。在应用程序的其他部分,我们不想直接获取Typhoon实例:
所以我们做的是:
将组件(或其中一个组件,在模块化设置中)注入我们需要的类中。一旦激活了一个程序集,这实际上就是一个TyphoonComponentFactory
构成程序集的实例。
它将作为发出构建对象图的工厂。
ObjectGraph
。因此,我们不会在内存中保留任何对象 - 只是用于构建它们的方法。对象图就在我们需要时实例化。 示例:强>
- (RootViewController *)rootController
{
return [TyphoonDefinition withClass:[RootViewController class]
configuration:^(TyphoonDefinition* definition) {
[definition injectProperty:@selector(assembly)];
}];
}
documentation for this feature is here。
<强>故事板:强>
如果您想使用故事板和Objective-C,可以use auto-injection macros on your view controllers。