2016-12-13 17 views
1

私は自分のプロジェクトに台風を統合しようとしています。他のアセンブリでアセンブリを再利用

DBManager、ProductDataManager、およびCustomerDataManagerという3つのクラスがあります。 ProductDataManagerとCustomerDataManagerの両方は、DB操作のためにDBManagerに依存しています。

@interface ProductDataManager() 
@property (nonatomic, strong) DBManager *dbManager; 
@end 

@implementation ProductDataManager 

- (instancetype)initWithDBManager:(DBManager*)dbManager 
{ 
    self = [super init]; 
    if (self) { 
     _dbManager = dbManager; 
    } 
    return self; 
} 


@interface CustomerDataManager() 
@property (nonatomic, strong) DBManager *dbManager; 
@end 

@implementation CustomerDataManager 

- (instancetype)initWithDBManager:(DBManager*)dbManager 
{ 
    self = [super init]; 
    if (self) { 
     _dbManager = dbManager; 
    } 
    return self; 
} 

ここでは、3つのアセンブリを作成します。

@interface DBManagerAssembly() 

@end 

@implementation DBManagerAssembly 

- (DBManager *)dbManager { 
    return [TyphoonDefinition withClass:[DBManager class] configuration:^(TyphoonDefinition *definition) { 
     }]; 
     definition.scope = TyphoonScopeSingleton; 
    }]; 
} 






@interface CustomerDataManagerAssembly() 
@property (nonatomic, strong) DBManagerAssembly *dbManagerAssembly; 
@end 

@implementation CustomerDataManagerAssembly 

- (CustomerDataManager *)customerDataManager { 
    return [TyphoonDefinition withClass:[CustomerDataManager class] configuration:^(TyphoonDefinition *definition) { 
     [definition useInitializer:@selector(initWithDBManager:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:self.dbManager]; 
     }]; 
    }]; 
} 

- (DBManager *)dbManager { 
    return [self.dbManagerAssembly dbManager]; 
} 





@interface ProductDataManagerAssembly() 
@property (nonatomic, strong) DBManagerAssembly *dbManagerAssembly; 
@end 

@implementation ProductDataManagerAssembly 

- (ProductDataManager *)productDataManager { 
    return [TyphoonDefinition withClass:[ProductDataManager class] configuration:^(TyphoonDefinition *definition) { 
     [definition useInitializer:@selector(initWithDBManager:) parameters:^(TyphoonMethod *initializer) { 
      [initializer injectParameterWith:self.dbManager]; 
     }]; 
    }]; 
} 

- (DBManager *)dbManager { 
    return [self.dbManagerAssembly dbManager]; 
} 

はAppDelegate

- (NSArray *)initialAssemblies 
{ 
    return @[[DBManagerAssembly class], [ProductDataManagerAssembly class], [CustomerDataManagerAssembly class]]; 
} 

でそれらを有効にししかし、アプリの起動時に、それは

[NSException raise:NSInvalidArgumentException format:@"Key '%@' is already registered.", _definition.key]; 

例外がスローされます私の質問が正しくアセンブリを再利用し、例外を回避する方法ですか...?

答えて

2

Typhoonでは、システム内の主要なアーキテクチャアクターの論理グループを作成できます。この機能はAssembly Modularizationと呼ばれます。定義されたすべてのコンポーネントは、単一のTyphoonComponentFactoryになります。これには、ビルドされたインスタンスを生成するレシピが含まれています。アセンブリは、定義を返し活性化前

assembly modules

。実行時にアセンブリをファサードとして使用して、ビルドされたインスタンスを返すことができます。 Objective-Cメッセージ転送を使用して、メソッド呼び出しを[factory componentForKey:theMethodName]に解決します。したがって:

  • アセンブリ全体の各コンポーネントには、一意の名前が必要です。あなたのコードで

、あなたが定義した:

- (DBManager *)dbManager { 
    return [self.dbManagerAssembly dbManager]; 
} 

は、この定義を削除し、代わりに持ってcustomerDataManagerを編集:

[initializer injectParameterWith:[self.dbManagerAssembly dbManager]]; 

すべてがうまくなります。

+0

ありがとうございました、この回答は私の問題を解決しました。下のメカニズムを理解するためのソースコードをトレースする必要があるようです。 – vampirewalk

+0

ようこそ。うまくいけば、それをやりたいのでなければ、ソースを読む必要はありません。しかし、いくつかのルールと使用制限があります。ここで、Typhoonがフードの下でどのように機能するかについて、いくつかの情報があります:https://github.com/appsquickly/Typhoon/wiki/TyphoonAssembly –

関連する問題