在尝试使用 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++ 风格的静态调度,因此运行时方法拦截/代理是不可能的。
关于ios - Swift 中的 Typhoon 延迟注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342775/