台风注入 属性 到一个新对象
Typhoon Inject Property to a new object
我开始在 iOS 上使用 DI 容器,但我不知道如何在这种情况下注入 属性:
假设我们有:
Assembly.m
- (ClassA *)classA {
return [TyphoonDefinition withClass:[ClassA class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(url) with:@"http://inject:URL"];
}];
}
还有两个类
A类
@interface ClassA : NSObject
@property (nonatomic,readwrite) NSString *url;
@end
B级
@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 并且此注入工作正常,但我需要将 属性 注入新对象。
也许我不明白所有的原理,但我应该问。谢谢
试试这个。
- (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];
引导台风
您可以 bootstrap Typhoon,并保留对它的引用,通常在 AppDelegate 中。在应用程序的其他部分,我们不想直接获取 Typhoon 的实例:
- 我们正在将我们的应用程序直接耦合到 Typhoon
- 这不是依赖注入,难以测试等
所以我们做的是:
将程序集(或模块化设置中的一个程序集)注入我们需要的 class 中。一旦程序集被激活,这实际上将是冒充程序集的 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。
我开始在 iOS 上使用 DI 容器,但我不知道如何在这种情况下注入 属性:
假设我们有:
Assembly.m
- (ClassA *)classA {
return [TyphoonDefinition withClass:[ClassA class] configuration:^(TyphoonDefinition *definition) {
[definition injectProperty:@selector(url) with:@"http://inject:URL"];
}];
}
还有两个类
A类
@interface ClassA : NSObject
@property (nonatomic,readwrite) NSString *url;
@end
B级
@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 并且此注入工作正常,但我需要将 属性 注入新对象。
也许我不明白所有的原理,但我应该问。谢谢
试试这个。
- (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];
引导台风
您可以 bootstrap Typhoon,并保留对它的引用,通常在 AppDelegate 中。在应用程序的其他部分,我们不想直接获取 Typhoon 的实例:
- 我们正在将我们的应用程序直接耦合到 Typhoon
- 这不是依赖注入,难以测试等
所以我们做的是:
将程序集(或模块化设置中的一个程序集)注入我们需要的 class 中。一旦程序集被激活,这实际上将是冒充程序集的
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。