ios - Swift 中的 Typhoon 延迟注入(inject)

标签 ios swift dependency-injection lazy-initialization typhoon

在尝试使用 Typhoon DI 时,我意识到 LazySingleton 范围没有按预期工作,这意味着惰性属性甚至在使用之前就被注入(inject)了。更具体地说,我创建了一个 TyphoonAssembly,如下所示:

public class AppAssembly : TyphoonAssembly {

    public dynamic func knight() -> AnyObject{

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

            definition.injectProperty("name", with: "Dragon")

            definition.injectProperty("horse")

            definition.scope = TyphoonScope.LazySingleton

        }
    }

    public dynamic func horse() -> AnyObject{

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

            definition.injectProperty("color", with: "red")

            definition.scope = TyphoonScope.LazySingleton
        }
    }

}

其中 Knight 是 NSObject 并且有 validateProperties功能

class Knight:NSObject {

    var name:String?
    var horse: Horse?

    func validateProperties(){

        if name != nil{

            println("Name not nil")
        }

        if horse != nil{

            println("Horse not nil")
        }
    }
}

激活装配并从中获得骑士后,调用 validateProperties函数总是打印 Name not nil 和 Horse not nil 即使这些属性从未在我的代码中使用。我是否在这里遗漏了一些东西,或者只是延迟注入(inject)与 Swift 延迟存储属性的工作方式不同?

最佳答案

您对惰性单例一词的解释是有道理的,但它不是正确的。 TyphoonScopeLazySingleton 意味着 Typhoon 在请求之前不会实例化整个对象。一旦请求所有属性将被注入(inject)。没有代理可以按需注入(inject) - 如果您对这样的功能感兴趣,您介意在 Github 上向我们提出问题吗?

你是对的,如果类扩展了 NSObject 且属性是与 Objective-C 兼容的类型,这样的功能只能在 Swift 中工作,因为“纯”Swift 使用 C++ 风格的静态调度,因此运行时方法拦截/代理是不可能的。

这是user guide for Typhoon scopes

关于ios - Swift 中的 Typhoon 延迟注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342775/

相关文章:

ios - 如何为日期结构 "2014-04-01T13:30:00.000+0000"设置日期格式化程序

ios - 一个 UIView Swift 中的多个 TableView - 如何同时显示两者

android - 在 super.onCreate() 之前将 Hilt 注入(inject)到 Activity 中

ios - XCTestCase waitForExpectationsWithTimeout :handler: throwing EXC_BAD_ACCESS when expectation is not fulfilled

ios - "absolute position" ScrollView 内的 View

swift - 在 iOS 中使用核心蓝牙每 15 分钟从 BLE 设备获取数据

swift - 如何从 Swift 调用汇编函数

go - 嵌套依赖注入(inject)在 golang 中是否可以接受?

typescript - Angular 2 : Inject service into class

ios - Swift 包管理器 - 在包的 Storyboard中设置自定义类失败