2

При попытке и игре с Typhoon DI я понял, что область LazySingleton работает не так, как ожидалось, ленивые свойства впрыскиваются еще до их использования. Будучи более конкретным, я создал TyphoonAssembly следующим образом:Тайфун ленивая инъекция в Swift

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 
     } 
    } 

} 

где рыцарь 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 функцию всегда печатать имя не ноль и Лошадь не ноль, даже эти свойства никогда не используются в моем коде. Я что-то пропустил здесь или просто ленивая инъекция не работает так же, как и быстрые ленивые хранимые свойства?

ответ

2

Ваша интерпретация термина lazy singleton имеет смысл, но его не правильный. TyphoonScopeLazySingleton означает, что тайфун не будет создавать экземпляр всего объекта, пока его не попросят. После того, как его попросят, будут добавлены все свойства. Если вы заинтересованы в такой функции, вам не нужно прокси-сервера, если вы заинтересованы в такой функции, не могли бы вы подняли проблему для нас в Гитубе?

Вы правы, что такая функция будет работать только в Swift, если класс расширен NSObject, а свойства были типами, совместимыми с Objective-C, так как «чистый» Swift использует статическую отправку стилей стиля C++ и, следовательно, проксирование невозможно.

Вот user guide for Typhoon scopes.