2016-11-08 20 views
1

我开始使用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属性r(assembly) 是的,我可以添加属性到我的ViewController和这个注入工作正常,但我需要注入属性到新的对象。

也许我不明白所有的原则,但我应该问。 Thx

回答

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]; 

自举台风

可以引导台风,并保持对它的引用,通常在AppDelegate中。在应用程序的其他部分,我们不希望直接获取台风的实例:

  • 我们连接我们的应用程序直接在台风
  • 这不是依赖注入,难以测试等

所以我们做的却是什么:

  • 注入组件(或组件之一,在一个模块化的建立),到这里我们需要它的类。一旦装配被激活,这实际上将作为装配的一个实例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

+0

是的,它的意义和它的工作,但我不喜欢总是从大会得到这个对象。这种情况下依赖注入的工作在哪里? –

+0

@ dev.nikolaz你为什么不喜欢它?使用程序集(IoC容器)获取某个对象是可以的。所以DI是一种注入依赖关系的机制(对于属性依赖关系),它使用IoC容器来保存配置设置。 –

+0

是的你是对的,这是配置设置)),在这一刻这正确回答。大thx! –

相关问题