Dagger2 benutzerdefinierte @Qualifier Verwendung

9

Angenommen, ich baue ein Auto und habe mehrere Brake-Beans mit verschiedenen Implementierungen

%Vor%

Warum muss mein CarModule @Provides für die spezifischen Bremsentypen definieren? Sollte der benutzerdefinierte Anmerkungstyp @BrakeType nicht ausreichen, um zu bestimmen, welcher Impl injiziert werden soll? Oder würde das eine Reflektion erfordern, die dolch2 nicht benutzt?

%Vor%     
Roger H. 06.03.2016, 16:43
quelle

4 Antworten

3

Der Dolch betrachtet keine Qualifier-Annotationen in Klassen, nur in den Methoden @Provides oder @Binds . Daher haben die @BrakeType(value="abs") -Anmerkungen für Ihre Klassen keine Auswirkung.

Eine kanonische Art, Ihren Code zu schreiben, ist:

%Vor%

Beachten Sie, dass Sie, da Sie @Inject für die Konstruktoren Ihrer Implementierungen haben, einfach Daggers @Bind verwenden können, um die Implementierungen direkt an die entsprechend qualifizierte Schnittstelle zu binden.

    
Jesse Beder 10.03.2016 05:36
quelle
1

Für den Datensatz können Sie Ihre eigenen Qualifier-Annotationen (als BrakeType) verwenden oder einfach nur @Named von Dagger verwenden. Wenn Sie diesen letzten Code verwenden, sieht Ihr Code ungefähr so ​​aus:

%Vor%

Und auf Ihrem Modul:

%Vor%

Denken Sie daran, Dagger-Namenskonventionen zu verwenden (wie Präfix bereitzustellen), um das meiste davon zu bekommen. Und versuchen Sie auf Ihren Modulen, alle @Provides-Methoden statisch zu verwenden, da die resultierende Implementierung sie nicht instanziieren muss.

Kurz gesagt, die Bieter und Qualifier arbeiten zusammen, so dass Sie beide benötigen.

Quelle: Dagger Benutzerhandbuch .

    
Murciegalo84 09.08.2017 01:11
quelle
0

Reflection ist hier wahrscheinlich kein großes Problem, weil es zur Kompilierzeit passieren würde.

Ich habe den Quellcode nicht durchgesehen, aber dagger ist nur ein Annotationsprozessor - er registriert sich, um bei jedem Set aufgerufen zu werden von gegebenen Annotationen wird verwendet. Während der Qualifier allein wahrscheinlich ausreichen würde, um herauszufinden, was Sie beabsichtigten, kann ich die folgenden Gründe denken, warum dies nicht die beste Lösung sein könnte.

javax.inject.Qualifier ist Teil einer größeren API und könnte auch von anderen Bibliotheken in anderem Kontext verwendet werden. Daher möchten Sie vielleicht nicht, dass Dolch Code für eine Methode generiert, nur weil er mit einem Qualifikationsmerkmal versehen ist.

Ein weiterer Grund könnte sein, dass dagger, da es die Möglichkeit gibt, benutzerdefinierte Qualifizierer zu erstellen, jede Annotation für jede Methode in jedem Modul überprüfen und dann selbst bestimmen müsste, ob diese Annotation selbst mit @Qualifier versehen ist, um zu sehen, ob Methode ist von Interesse für sie. Dies ist eher ein unnötiger Overhead.

Es könnte mehrere Gründe geben, aber die hier aufgelisteten 2 scheinen genug zu sein, um Benutzer von Dolch dazu zu bringen, irgendeine Art von Vertrag zu verwenden: @Provides .

Anmerkungen haben keinen Einfluss auf die Leistung des Codes, und eine zusätzliche Anmerkung wird keinen Schaden anrichten. Daher gibt es mehr zu gewinnen als zu verlieren, wenn Sie so verfahren.

    
David Medenjak 06.03.2016 17:47
quelle
0

@Inject constructor bedeutet, dass in Ihrem Fall ein Typ angegeben wird, der selbst die Klasse AbsBrakeImpl und BrakeImpl angibt. Wenn Sie also versuchen, mit Brake zu injizieren, kann dagger den Anbieter nicht finden .

Qualifier in @Inject constructor ist keine Arbeit, da der Klassentyp eindeutig ist, müssen wir kein Qualifikationsmerkmal hinzufügen.

Also, in Ihrem Fall, oder Sie müssen CarModule verwenden, um Dagger explizit zu informieren, oder ändern Sie Ihren Konstruktor mit

%Vor%     
luffy 27.12.2017 08:55
quelle

Tags und Links