ios - 台风初始化程序注入(inject)和调用 super.init()

标签 ios swift dependency-injection typhoon

我有一个父类和子类,子类中有一个初始化器,它接受一些参数,然后调用 super.init() 来初始化基类的属性。

因为我有很多子类,所以我想重用代码来注入(inject)参数,但是我想不出一种方法来将一些成员注入(inject)基类定义中,而其余成员则注入(inject)子类定义中.

我尝试了以下方法:

public dynamic func baseManager() -> AnyObject {
    return TyphoonDefinition.withClass(BaseManager.self) {
        (definition) in

        definition.useInitializer("initWithBaseParam1:baseParam2:") {
            (initializer) in

            initializer.injectParameterWith(self.baseParam1())
            initializer.injectParameterWith(self.baseParam2())
        }
    }
}

public dynamic func authenticationManager() -> AnyObject {

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

        definition.parent = self.baseManager()
        definition.useInitializer("initWithChildParam1:childParam2:baseParam1:baseParam2:") {
            (initializer) in

            initializer.injectParameterWith(self.childParam1())
            initializer.injectParameterWith(self.childParam2())
        }
    }
}

但是我得到一个错误,我使用了一个带有 4 个参数的初始化器,但只注入(inject)了其中的 2 个。有什么方法可以完成这项工作,还是我必须将基本参数重构为类似于文档中示例的属性?

最佳答案

您可以从父模板继承初始化器或覆盖它,但不幸的是,您不能使用父模板中定义的参数之外的额外参数扩展初始化器。

建议的备选方案:

使用属性注入(inject)

通常我们建议支持初始化器注入(inject),它允许创建不可变对象(immutable对象)并在构造后进行状态验证。属性注入(inject)中的这些缺点可以通过以下方式解决:

  • 指定 a callback method在注入(inject)属性后使用。
  • 对于设计为不可变的实例,将属性声明为内部可读写,但外部只读。

使用组合而不是继承

另一个建议是创建一个适当范围的定义,封装倾向于一起使用的配置并注入(inject)它。

根据具体情况,这可能是有利的 - 有很多关于“组合与继承”的好文章以及每篇文章的合适时机。

关于ios - 台风初始化程序注入(inject)和调用 super.init(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405215/

相关文章:

c# - 使用 Spring .NET 将依赖项注入(inject) MVC Controller

ios - 如何清除 Restkit 中 UITableView 的 NSFetchedResultsController 结果

iOS - 不同 Storyboard中的容器组件

ios - Twitter iOS 用户登录

ios - 将 WebView 与 Firebase 数据库结合使用

c# - 为什么 .NET Core DI 更喜欢接受 IEnumerable<T> 的构造函数而不是无参数构造函数?

ios - 使屏幕外表格单元格 subview 可用于 makeFirstResponder 的最佳方法

ios - 使用 Swift 2 在 Xcode 7 中展开不起作用

ios - 有没有办法获取我的 iOS 应用程序屏幕截图列表?

c# - Microsoft Practice 使用 Unity 寄存器类型