Typhoon Inject属性为新对象

时间:2016-11-08 14:08:22

标签: ios dependency-injection typhoon

我开始在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

1 个答案:

答案 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实例:

  • 我们将申请直接与Typhoon相结合
  • 这不是依赖注入,难以测试等等。

所以我们做的是:

  • 将组件(或其中一个组件,在模块化设置中)注入我们需要的类中。一旦激活了一个程序集,这实际上就是一个TyphoonComponentFactory构成程序集的实例。

  • 它将作为发出构建对象图的工厂。

  • Typhoon的默认范围是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