Ein ultraleichtes Dependency-Injection-/Service-Locator-Framework für Swift 5.x auf iOS.
Hinweis: Resolver ist jetzt offiziell veraltet und wird durch mein neues Abhängigkeitsinjektionssystem Factory ersetzt. Factory ist ein echtes Container-basiertes Abhängigkeitsinjektionssystem, das kompilierzeitsicher und kleiner, leichter und schneller als Resolver ist. So gut Resolver auch ist, Factory ist besser.
Dependency-Injection-Frameworks unterstützen das Entwurfsmuster „Inversion of Control“. Abgesehen von den technischen Definitionen läuft die Abhängigkeitsinjektion im Wesentlichen auf Folgendes hinaus:
| Einem Objekt die Dinge geben, die es braucht, um seine Aufgabe zu erfüllen.
Das ist es. Durch die Abhängigkeitsinjektion können wir Code schreiben, der lose gekoppelt ist und sich daher einfacher wiederverwenden, verspotten und testen lässt.
Weitere Informationen finden Sie unter: Eine sanfte Einführung in die Abhängigkeitsinjektion.
Es gibt sechs klassische Abhängigkeitsinjektionsstrategien:
Resolver unterstützt sie alle. Folgen Sie den Links für eine kurze Beschreibung, Beispiele sowie die Vor- und Nachteile der einzelnen Optionen.
Apropos Anmerkungen: Resolver unterstützt jetzt die Auflösung von Diensten mithilfe der neuen Property-Wrapper-Syntax in Swift 5.1.
class BasicInjectedViewController : UIViewController {
@ Injected var service : XYZService
@ LazyInjected var service2 : XYZLazyService
@ WeakLazyInjected var service3 : XYZAnotherLazyService ?
}
Fügen Sie einfach das Schlüsselwort „Injected“ hinzu und Ihre Abhängigkeiten werden automatisch aufgelöst. Weitere Informationen zu dieser und anderen Strategien finden Sie in der Annotation-Dokumentation.
Es gibt auch einen @InjectedObject
-Wrapper, der beobachtbare Objekte in SwiftUI-Ansichten einfügen kann.
Resolver ist in etwas mehr als 700 Zeilen tatsächlichen Codes in einer einzigen Datei implementiert, verpackt aber in diesen 700 Zeilen eine Menge Funktionen.
TLDR: Wenn nichts anderes, lesen Sie unbedingt etwas über automatische Typinferenz, Bereiche und Optionen.
Die Verwendung von Resolver ist ein einfacher, dreistufiger Prozess:
Wie bereits erwähnt, ist Resolver ein ultraleichtes Dependency-Injection-System, das in etwas mehr als 700 Codezeilen implementiert und in einer einzigen Datei enthalten ist.
Resolver ist auch auf Leistung ausgelegt. SwinjectStoryboard zum Beispiel ist ein großartiges Abhängigkeitsinjektionssystem, aber Resolver ist beim Auflösen von Abhängigkeitsketten etwa 800 % schneller als Swinject.
Und im Gegensatz zu einigen anderen Systemen ist Resolver zu 100 % in Swift 5 geschrieben, ohne Objective-C-Code, Methoden-Swizzling oder interne Abhängigkeiten von der Objective-C-Laufzeit.
Weiter, Resolver:
Schließlich schreiben Sie mit der automatischen Typinferenz in der Regel auch etwa 40–60 % weniger Dependency-Injection-Code mit Resolver.
Resolver unterstützt CocoaPods und den Swift Package Manager.
pod " Resolver "
Resolver selbst ist nur eine einzige Quelldatei (Resolver.swift), daher ist es auch einfach, die Datei einfach herunterzuladen und Ihrem Projekt hinzuzufügen.
Beachten Sie, dass die aktuelle Version von Resolver (1.4) Swift 5.3 unterstützt und dass die Mindestversion von iOS, die derzeit mit dieser Version unterstützt wird, iOS 11 ist.
Informationen zur Unterstützung früherer Versionen finden Sie im Installationshandbuch.
Ich habe mein Builder-Repository öffentlich gemacht. Es handelt sich um eine einfache iOS-Anwendung im Master-/Detail-Stil, die Beispiele für ... enthält.
Ich verwende es auch, um mit neuem Code zu experimentieren, der Builder-Muster im SwiftUI-Stil verwendet, um die Benutzeroberflächenkonstruktion zu erstellen und Netzwerkanforderungen zu erstellen. Hör zu.
Es ist möglich, dass aktuelle Updates von Resolver zu bahnbrechenden Änderungen in Ihrer Codebasis führen.
Resolver 1.4 verbesserte Thread-Sicherheit und Leistung. Keine wichtigen Änderungen, obwohl der direkte Zugriff auf die Bereiche von Resolver jetzt veraltet ist. Siehe: Bereiche.
Resolver 1.3 fügt Resolver Namensräume hinzu. Das Registrieren von Namen ermöglicht eine bessere automatische Vervollständigung und macht Ihren Code sicherer, indem potenzielle Fehler bei der Laufzeitauswertung reduziert werden. Dies ist eine mögliche bahnbrechende Änderung. Siehe: Benannte Instanzen
Resolver 1.2 hat die Art und Weise geändert, wie Argumente an die Registrierungsfabrik übergeben werden, um eine bessere Unterstützung für die Übergabe und Verarbeitung sowohl einzelner als auch mehrerer Argumente bereitzustellen. Dies ist eine bahnbrechende Veränderung. Siehe: Übergabe und Behandlung mehrerer Argumente
Resolver 1.5 hat mehrere der in Resolver verwendeten Registrierungs- und Caching-Mechanismen aktualisiert. Dies ist wahrscheinlich kein Problem, es sei denn, Sie haben etwas geschrieben, das vom internen Verhalten von Resolver abhängt.
Wenn Sie meine Arbeit an Factory und Resolver unterstützen möchten, denken Sie über ein GitHub-Sponsoring nach! Es gibt viele Ebenen für mehr Unterstützung und sogar für Mentoring und Unternehmensschulung.
Oder du spendierst mir einfach eine Tasse Kaffee!
Resolver wurde von Michael Long, einem leitenden iOS-Softwareentwickler und einem der 1.000 besten Technologieautoren auf Medium, entworfen, implementiert, dokumentiert und gewartet.
Michael war außerdem einer der Gewinner des Open Source Peer Reward von Google im Jahr 2021 für seine Arbeit an Resolver.
Resolver ist unter der MIT-Lizenz verfügbar. Weitere Informationen finden Sie in der LICENSE-Datei.