具有附加属性注入的工厂初始化

时间:2014-10-31 08:11:59

标签: swift typhoon

在我的演示项目中,我用一个像这样的程序集中的基于工厂的创建替换了视图控制器的手动创建(正如Jasper Blues在这里演示的那样:https://stackoverflow.com/a/24227246/397898

// ApplicationAssembly

dynamic func mainStoryboard() -> AnyObject {
    return TyphoonDefinition.withClass(TyphoonStoryboard.self) {
        (definition) in

        definition.useInitializer("storyboardWithName:factory:bundle:") {
            (initializer) in

            initializer.injectParameterWith("Main")
            initializer.injectParameterWith(self)
            initializer.injectParameterWith(NSBundle.mainBundle())
        }

        definition.scope = TyphoonScope.Singleton
    }
}

// PersonListAssembly

dynamic func personListViewController() -> AnyObject {

        return TyphoonDefinition.withFactory(self.applicationAssembly.mainStoryboard(), selector: "instantiateViewControllerWithIdentifier:", parameters: {
            (factoryMethod) in

            factoryMethod.injectParameterWith("PersonListViewController")
        })
    }

但是视图控制器仍然需要一些其他依赖项。这样做时我该如何注射这个?

实际上我有两个问题:当我尝试使用这样的视图控制器时,所有IBOutlet都是零。我错过了什么吗?

根据Jasper的回复做出正确答案

dynamic func personListViewController() -> AnyObject {

    return TyphoonDefinition.withClass(PersonListViewController.self) {
        (definition) in

        definition.factory = self.applicationAssembly.mainStoryboard()
        definition.useInitializer("instantiateViewControllerWithIdentifier:", parameters: { (factoryMethod) in

            factoryMethod.injectParameterWith("PersonListViewController")
        })

        definition.injectProperty("presenter", with: self.personListPresenter())
    }
}

1 个答案:

答案 0 :(得分:1)

似乎声明从另一个Typhoon组件发出的组件的快捷方式不支持这个(尚未)。我们open an issue。同时你可以回归到Typhoon 1.0风格的API:

- (id)currentTheme
{
    return [TyphoonDefinition withClass:[PFTheme class] 
        configuration:^(TyphoonDefinition* definition)
    {
        definition.factory = [self themeFactory];
        [definition useInitializer:@selector(sequentialTheme)];
    }];
}

。 。当你使用这种方法时:

  • 初始化程序(带或不带args)实际上是将生成组件的对象的实例方法。
  • 可以设置其他属性,范围等。

我们创建了一个简短的方法,因为它有点令人困惑,无法引用一个初始化程序'这实际上是创建组件的类的实例方法。看起来在添加配置块时存在疏忽。