私は自分のプロジェクトに台風を統合しようとしています。他のアセンブリでアセンブリを再利用
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];
例外がスローされます私の質問が正しくアセンブリを再利用し、例外を回避する方法ですか...?
ありがとうございました、この回答は私の問題を解決しました。下のメカニズムを理解するためのソースコードをトレースする必要があるようです。 – vampirewalk
ようこそ。うまくいけば、それをやりたいのでなければ、ソースを読む必要はありません。しかし、いくつかのルールと使用制限があります。ここで、Typhoonがフードの下でどのように機能するかについて、いくつかの情報があります:https://github.com/appsquickly/Typhoon/wiki/TyphoonAssembly –