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 是不可能的。
在尝试使用 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 是不可能的。