Ich fange an, Dolch 2 in einer Anwendung zu verwenden, die ich entwickle, aber ich habe einige Fragen darüber, wie Dolch 2 funktioniert.Dolch 2 Injizierende Konstruktoren
Ich bekomme die ganze Logik hinter den @Provides-Methoden und der @Inject-Annotation für die Initialisierung Ihrer Abhängigkeiten, aber die @Inject-Annotation an Klassenkonstruktoren Art von Bugs meine Meinung.
Zum Beispiel:
Im meine app, ich habe ein Modul definiert, die ContextModule, den Kontext meiner Anwendung abzurufen:
ContextModule.java
@Module
public class ContextModule {
private final Context context;
public ContextModule(Context context) {
this.context = context;
}
@Provides
public Context context() {
return this.context;
}
}
Dieses Modul verwendet wird, von meiner BaseActivityComponent:
BaseActivityComponent.java
@BaseActivityScope
@Component(modules = ContextModule.class)
public interface BaseActivityComponent {
void injectBaseActivity(BaseActivity baseActivity);
}
So weit so gut .. dann habe ich eine AuthController-Klasse, die vom Kontext abhängt und ich möchte es in meine BaseActivity injizieren. Also in meinem AuthControllers.class Ich habe so etwas wie:
public class AuthController {
private Context context;
@Inject
public AuthController(Context context) {
this.context = context;
}
public void auth() {
// DO STUFF WITH CONTEXT
}
}
Und ich spritze es in meinem BaseActivity wie:
public class BaseActivity extends AppCompatActivity {
@Inject
AuthController authController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BaseActivityComponent component = DaggerBaseActivityComponent.builder()
.contextModule(new ContextModule(this))
.build();
component.injectBaseActivity(this);
authController.auth();
}
}
Nun meine Frage ist, wie funktioniert Dolch weiß, dass mein AuthControllers eine Abhängigkeit für BasisActivity? Nur durch
@Inject
AuthController authController;
es ist wie die gleiche Sache zu erklären, als ob ich ein ControllerModule wie geschaffen:
@Module(includes = ContextModule.class)
public class ControllerModule {
@Provides
AuthController authController(Context context) {
return new AuthController(context);
}
}
Und dann in meiner BaseActivityComponent würde ich meinen AuthController Getter hinzufügen und meine Abhängigkeit Modul ControllersModule ändern:
Wenn ich injectBaseActivity (this) aufrufen, "erzählt" Dolch, dass alle @Inject-Annotationen Abhängigkeiten von meiner Klasse sind, und dann sucht es mein Projekt ct für @Inject annotierte Konstruktoren, die diesem Typ entsprechen?
Ich dachte eine gute Sache über Dolch 2 ist, dass die Modul-Dateien als eine "Dokumentation" meiner Abhängigkeiten drei verwendet werden könnten. Aber wenn nur @Inject in allen Konstruktoren hinzugefügt wird, von denen ich die Kontrolle habe, könnte es in der Zukunft nicht ein wenig verwirrend werden, da Sie nicht wissen, was tatsächlich von was abhängt? (Ich meine, Sie wissen, was davon abhängt, Sie müssen nur eine Menge Dateien durchsuchen, um wirklich herauszufinden)
Gibt es Best Practices für die Verwendung von @Inject-Annotationen in Konstruktoren oder wenn die @Provides-Methode hinzufügen in Moduldateien? Ich bekomme das mit @Inject im Konstruktor Ich muss nicht die Konstruktordefinition in meiner Modul-Datei ändern, aber gibt es irgendwelche Nachteile?
Danke.
Awesome Antwort. Wissen Sie, ob es möglich ist, den Kotlin-Standardkonstruktor (den mit der Klassendefinition definierten) mit inject zu kommentieren? –
@saiedVanguard Es ist möglich: 'Klasse A @Inject Konstruktor (...)' –