首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >台风向新物体注入财产

台风向新物体注入财产
EN

Stack Overflow用户
提问于 2016-11-08 14:08:21
回答 1查看 314关注 0票数 1

我开始在iOS上使用DI容器,在本例中我不知道如何注入属性:

想象一下我们有:

Assembly.m

代码语言:javascript
复制
- (ClassA *)classA {
    return [TyphoonDefinition withClass:[ClassA class] configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(url) with:@"http://inject:URL"];
    }];
}

和两个班

ClassA

代码语言:javascript
复制
@interface ClassA : NSObject
@property (nonatomic,readwrite) NSString *url;
@end

ClassB

代码语言:javascript
复制
@interface ClassB : ClassA
@end

ViewController.m

代码语言:javascript
复制
@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];

   ClassB *cB = [ClassB new]; 
    NSLog(@"%@",cB.url);
}

我想通过ClassB创建新对象,所有对象都有来自DI容器(程序集)的带有url属性的注入--我可以将属性添加到我的ViewController中,而且这个注入工作得很好,但是我需要向新对象注入属性。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 14:18:33

尝尝这个。

代码语言:javascript
复制
- (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。所以,我们不把任何东西保存在记忆中--只是用来建造它们的食谱。对象图是在我们需要它的时候实例化的。
  • 通过这种方式,我们可以高效地从一个对象图到另一个对象图,并以松散耦合的方式进行处理。

示例:

代码语言:javascript
复制
- (RootViewController *)rootController
{
    return [TyphoonDefinition withClass:[RootViewController class] 
    configuration:^(TyphoonDefinition* definition) {
        [definition injectProperty:@selector(assembly)];
    }];
}

此功能的文档如下所示

Storyboards:

如果你喜欢使用故事板和目标C,你可以在视图控制器上使用自动注入宏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40489015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档