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 の遅延保存されたプロパティと同じように機能しませんか?