2

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

4

1 に答える 1

2

怠惰なシングルトンという用語の解釈は理にかなっていますが、正しいものではありません。TyphoonScopeLazySingletonTyphoon は、要求されるまでオブジェクト全体をインスタンス化しないことを意味します。すべてのプロパティが要求されると、注入されます。オンデマンドで挿入するためのプロキシはありません。そのような機能に興味がある場合は、Github で問題を提起していただけませんか?

「純粋な」SwiftはC++スタイルの静的ディスパッチを使用するため、クラスが拡張され、プロパティがObjective-Cと互換性のある型である場合、そのような機能がSwiftでのみ機能することは正しいです。NSObjectしたがって、ランタイムメソッドのインターセプト/プロキシは不可能です。

Typhoon スコープのユーザー ガイドは次のとおりです。

于 2015-07-10T14:36:00.973 に答える