Swift 台风懒惰注入

Typhoon lazy injection in Swift

在尝试使用 Typhoon DI 时,我意识到 LazySingleton 范围没有按预期工作,这意味着惰性属性甚至在使用之前就被注入了。更具体地说,我创建了一个 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 即使这些属性从未在我的代码中使用过。我是不是遗漏了什么,或者只是延迟注入与 Swift 延迟存储属性不同?

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

你是对的,如果 class 扩展 NSObject 并且属性类型与 Objective-C 兼容,那么这样的功能只能在 Swift 中工作,因为 "pure" Swift 使用 C++ 风格的静态调度,因此运行时方法 interception/proxying 是不可能的。

这是user guide for Typhoon scopes