2016-11-08 5 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(アセンブリ) はい私は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で、台風をブートストラップし、それへの参照を保持することができます。アプリケーションの他の部分では、我々は直接、台風のインスタンスを取得する必要はありません:

  • を私たちは、直接これは、などをテストするのが難しいの依存性注入、
  • ない
  • 台風ために私たちのアプリケーションをカップリングしています

だから、私たちが代わりにやっていることは次のとおりです。

  • は、我々はそれを必要とするクラスに(モジュラーセットアップ中、またはアセンブリの1)のアセンブリを注入します。アセンブリがアクティブ化されると、これは実際にアセンブリとしてポーズを取る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-containerを使います。 –

+0

はい、そうです、これは構成設定用です))、この時点でこれは正しく答えています。大きなthx! –

関連する問題