Abhängigkeitsspritze
DI ist eine Technik, die in der Softwareprogrammierung weit verbreitet ist. Sogar Google empfiehlt DI Android-Entwicklern, Android hat Bibliotheken wie Dagger, Hilt für diesen Zweck. DI bietet folgende Vorteile:
- Code-Wiederverwendbarkeit
- Einfaches Refactoring
- Einfaches Testen
Abhängigkeitsinjektion ist eine Technik, mit der Objekte von den Objekten getrennt werden können, von denen sie abhängig sind. Nehmen wir ein Beispiel für die Implementierung von DI in iOS.
class HTTPClient {
func downloadFrom(url: URL) {
//download data from remote
}
}
class DataDownload {
let client = HTTPClient()
func getData(url: URL) {
client.downloadFrom(url: url)
}
}
class client {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload()
self.dataDownload.getData(url: URL(string: "https://any_http_url.com")!)
}
}
class FTPClient {
func downloadFrom(url: URL) {
//download data from remote
}
}
class DataDownload {
let client = FTPClient()
func getData(url: URL) {
client.downloadFrom(url: url)
}
}
class client {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload()
self.dataDownload.getData(url: URL(string: "https://any_ftp_url.com")!)
}
}
protocol RemoteClient {
func downloadFrom(url: URL)
}
class FTPClient: RemoteClient {
func downloadFrom(url: URL) {
//download data from remote
}
}
class DataDownload {
let client: RemoteClient
init(client: RemoteClient) {
self.client = client
}
func getData(url: URL) {
client.downloadFrom(url: url)
}
}
class Client1 {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload(client: FTPClient())
self.dataDownload.getData(url: URL(string: "https://any_ftp_url.com")!)
}
}
class Client2 {
let dataDownload: DataDownload
init() {
self.dataDownload = DataDownload(client: HTTPClient())
self.dataDownload.getData(url: URL(string: "https://any_htttp_url.com")!)
}
}
RemoteClientwird DataDownloadvom Composer/Assembler injiziert Client1und Client2. Es entkoppelt auch Code. Jetzt können wir sie getrennt testen, ohne unerwünschte Abhängigkeiten zu erfüllen. Einige Profis aus dem obigen Code-Refactoring
- Leichtigkeit beim Testen.
- Schnellere Entwicklung neuer Funktionen.
- Verbesserte Xcode-Kompilierzeit (ich werde dazu einen separaten Blog schreiben).
- Spart Zeit und Geld.
- Konstruktorinjektion (oben erklärt)
- Funktionsinjektion
- Immobilieninjektion
class ChildViewController: UIViewController {
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func getDataFrom(_ client: RemoteClient, url: URL) {
client.downloadFrom(url: url)
}
}
class ParentViewController: UIViewController {
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func present() {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc = storyboard.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
vc.getDataFrom(client: HTTPClient(), url: URL(string:"https://any-url.com")!)
}
}
Property Injection: HTTPClient wird als Property Injection an übergeben var client.
class ChildViewController: UIViewController {
var client: RemoteClient?
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func getDataFrom(url: URL) {
client.downloadFrom(url: url)
}
}
class ParentViewController: UIViewController {
func viewDidLoad() { }
func viewWillAppear() { }
func viewDidAppear() { }
func present() {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let vc = storyboard.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
vc.client = HTTPClient()
}
}
Ich hoffe es hilft! Wenn Ihnen der Artikel gefallen hat und Sie weitere tolle Artikel lesen möchten, dann folgen Sie mir hier und zeigen Sie Ihre Unterstützung, da es mich motiviert, mehr zu schreiben.
Bitte teilen Sie Ihr Feedback zur Verbesserung des Inhalts und zum nächsten Thema, das Sie untersuchen möchten.
Vielen Dank fürs Lesen, viel Spaß beim Programmieren!!
Verweise
- https://essentialdeveloper.com
- https://developer.android.com/training/dependency-injection

![Was ist überhaupt eine verknüpfte Liste? [Teil 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































