Ios 在其他程序集中重用程序集

Ios 在其他程序集中重用程序集,ios,dependency-injection,typhoon,Ios,Dependency Injection,Typhoon,我正试图将台风融入我的项目中 我有三个类:DBManager、ProductDataManager和CustomerDataManager。ProductDataManager和CustomerDataManager都依赖DBManager进行数据库操作 @interface ProductDataManager () @property (nonatomic, strong) DBManager *dbManager; @end @implementation ProductDataMana

我正试图将台风融入我的项目中

我有三个类:DBManager、ProductDataManager和CustomerDataManager。ProductDataManager和CustomerDataManager都依赖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;
}
现在我为它们创建了三个程序集

@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];

我的问题是。。。如何正确地重用程序集并避免异常?

Typhone允许您在系统中创建关键体系结构参与者的逻辑分组。此功能称为。定义的所有组件都进入一个
typhoncomponentfactory
——其中包含用于发送构建实例的配方

激活前,程序集返回定义。在运行时,您可以将程序集用作外观来返回生成的实例。它使用Objective-C消息转发来解析对
[factory componentForKey:theMethodName]
的方法调用。因此:

  • 整个部件集中的每个零部件都必须具有唯一的名称
在代码中,您定义了:

- (DBManager *)dbManager {
    return [self.dbManagerAssembly dbManager];
}
删除此定义,然后编辑
customerDataManager
,改为具有:

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

一切都会好起来的

谢谢,这个答案解决了我的问题。看来我必须追踪源代码才能理解其背后的机制。不客气。希望您不必阅读源代码,除非您想这样做。不过,还有一些规则和使用限制需要了解。以下是有关台风如何在引擎盖下工作的更多信息: