在另一个定义中使用台风汇编模型属性

时间:2015-07-29 09:13:35

标签: ios objective-c dependency-injection typhoon

我遇到Typhoon框架问题。我有构建我的数据模型的程序集:

- (DataModel *)dataModel {
    return [TyphoonDefinition withClass:[DataModel class]];
}

现在我想组装我的所有视图模型。在一个定义中,我需要确定用户是否已设置密码。该信息存储在数据模型中。所以我的定义如下:

- (id)passViewModel {
    return [TyphoonDefinition withClass:[PasscodeViewModel class] configuration:^(TyphoonDefinition *definition) {
        [definition useInitializer:@selector(initwithType:) parameters:^(TyphoonMethod *initializer) {
            NSNumber *type = [self.modelAssembly dataModel] isPasscodeSet ? @(TypeReturning) : @(TypeNew);
            [initializer injectParameterWith:type];
        }];
    }];
}

问题在于,当激活定义时,dataModel是TyphoonDefinition,而不是DataModel。

是否有任何方法可以让我获得dataModel的属性值?

编辑:

根据下面的答案,我的装配现在看起来像这样:

- (UIViewController *)passcodeViewController {
    return [TyphoonDefinition withOption:[(id)[self.modelAssembly dataModel] property:@selector(isPasscodeSet)]
                                     yes:[self passcodeViewController:@(TypeReturning)]
                                      no:[self passcodeViewController:@(TypeNew)]];
}

- (UIViewController *)passcodeViewController:(NSNumber *)entryType {
    return [TyphoonDefinition withClass:[PasscodeViewController class] configuration:^(TyphoonDefinition *definition) {
        [definition injectProperty:@selector(entryType) with:entryType];
        [definition injectProperty:@selector(viewModel) with:[self.viewModelsAssembly passcodeViewModel:entryType]];
    }];
}

我正在使用" passcodeViewController"作为故事板中的台风键。不幸的是,我尝试注入的viewModel和entryType是nil。

1 个答案:

答案 0 :(得分:2)

你是对的,一个程序集可以是活动的也可以是非活动的,因此它不是为了做你想做的事情而设计的。因此,您的用例名为Typhoon Option Matcher

您可以根据(激活的)程序集中的另一个对象的开头或运行时参数返回一个或另一个定义。示例:

- (id)passViewModel
{
    return [TyphoonDefinition withOption:[(id)[self.modelAssembly dataModel] 
        property:@selector(isPasscodeSet)]
        yes:[self passViewModelWithType:@(TypeReturning)] 
        no:[self passViewModelWithType:@(TypeNew)]];
}

- (id)passViewModelWithType:(NSNumber *)type
{
    return [TyphoonDefinition withClass:[PasscodeViewModel class] 
      configuration:^(TyphoonDefinition *definition) {
        [definition useInitializer:@selector(initwithType:) 
          parameters:^(TyphoonMethod *initializer) {
            [initializer injectParameterWith:type];
        }];
    }];
}

这是否符合您的需求?也许你可以将它与factory definitions结合起来。