Manuelle Abhängigkeitsinjektion (Views)

Konzepte und Jetpack Compose-Implementierung

Die empfohlene App-Architektur von Android sieht vor, dass Sie Ihren Code in Klassen unterteilen, um von der Trennung von Zuständigkeiten zu profitieren. Bei diesem Prinzip hat jede Klasse der Hierarchie eine einzige definierte Zuständigkeit. Dies führt zu mehr, kleineren Klassen, die miteinander verbunden werden müssen, um die Abhängigkeiten der anderen zu erfüllen.

Android-Apps bestehen in der Regel aus vielen Klassen, von denen einige voneinander abhängig sind.
Abbildung 1. Modell eines Anwendungsdiagramms einer Android-App graph

Die Abhängigkeiten zwischen Klassen können als Diagramm dargestellt werden, in dem jede Klasse mit den Klassen verbunden ist, von denen sie abhängt. Die Darstellung aller Ihrer Klassen und ihrer Abhängigkeiten bildet das Anwendungsdiagramm. In Abbildung 1 sehen Sie eine Abstraktion des Anwendungsdiagramms. Wenn Klasse A (ViewModel) von Klasse B (Repository) abhängt, gibt es eine Linie von A nach B, die diese Abhängigkeit darstellt.

Die Abhängigkeitsinjektion hilft, diese Verbindungen herzustellen, und ermöglicht es Ihnen, Implementierungen für Tests auszutauschen. Wenn Sie beispielsweise ein ViewModel testen, das von einem Repository abhängt, können Sie verschiedene Implementierungen von Repository mit Fakes oder Mocks übergeben, um die verschiedenen Fälle zu testen.

Grundlagen der manuellen Abhängigkeitsinjektion

In diesem Abschnitt wird beschrieben, wie die manuelle Abhängigkeitsinjektion in einem realen Android-App-Szenario angewendet wird. Es wird ein iterativer Ansatz beschrieben, wie Sie die Abhängigkeitsinjektion in Ihrer App verwenden können. Der Ansatz wird verbessert, bis er einem Punkt erreicht, der dem sehr ähnlich ist, was Dagger automatisch für Sie generieren würde. Weitere Informationen zu Dagger finden Sie unter Grundlagen von Dagger.

Ein Flow ist eine Gruppe von Bildschirmen in Ihrer App, die einer Funktion entsprechen. Anmeldung, Registrierung und Bezahlung sind Beispiele für Flows.

Bei einem Anmelde-Flow für eine typische Android-App hängt LoginActivity von LoginViewModel ab, das wiederum von UserRepository abhängt. hängt dann von UserLocalDataSource und UserRemoteDataSource ab, die wiederum von einem Retrofit-Dienst abhängen.UserRepository

LoginActivity ist der Einstiegspunkt für den Anmelde-Flow und der Nutzer interagiert mit der Aktivität. Daher muss LoginActivity das LoginViewModel mit allen seinen Abhängigkeiten erstellen.

Die Klassen Repository und DataSource des Flows sehen so aus:

Kotlin

class UserRepository(
   private val localDataSource: UserLocalDataSource,
   private val remoteDataSource: UserRemoteDataSource
) { ... }

class UserLocalDataSource { ... }
class UserRemoteDataSource(
   private val loginService: LoginRetrofitService
) { ... }

Java

class UserLocalDataSource {
   public UserLocalDataSource() { }
   ...
}

class UserRemoteDataSource {

   private final Retrofit retrofit;

   public UserRemoteDataSource