Podkomponente bodeža 2 vs ovisnosti o komponentama

Dagger 2 Subcomponents Vs Component Dependencies



Riješenje:

Ovisnosti o komponentama - Koristite ovo ako želite zadržati dvije komponente neovisnima.

Potkomponente - Koristite ovo ako želite zadržati dvije komponente povezane.




Za objašnjenje ću upotrijebiti donji primjer Ovisnosti o komponentama i Podkomponente . Neke primjere vrijedne primjera u primjeru su:



  • SomeClassA1 može se stvoriti bez ikakve ovisnosti.ModuleA pruža i instancuSomeClassA1 putemprovideSomeClassA1 () metoda.
  • SomeClassB1 se ne može stvoriti bezNekiKlasaA1.ModuleB može pružiti primjerSomeClassB1 samo ako je instancaSomeClassA1 se prenosi kao argumentprovideSomeClassB1 () metoda.
@Module javna klasa ModuleA {@Pružava javnu SomeClassA1 provideSomeClassA1 () {return new SomeClassA1 (); }} @Module javna klasa ModuleB {@Providi javna SomeClassB1 provideSomeClassB1 (SomeClassA1 someClassA1) {vrati novi SomeClassB1 (someClassA1); }} javna klasa SomeClassA1 {javna SomeClassA1 () {}} javna klasa SomeClassB1 {privatna SomeClassA1 someClassA1; javni SomeClassB1 (SomeClassA1 someClassA1) {this.someClassA1 = someClassA1; }}

Bodež će se pobrinuti za prenošenje instanceSomeClassA1 kao argument zaprovideSomeClassB1 () metoda uključenaModul B kad god se Komponenta/Podkomponenta deklariraModul B je inicijaliziran. Moramo uputiti Bodež kako ispuniti ovisnost. To se može učiniti korištenjem Ovisnost o komponentama ili Podkomponenta .



Ovisnost o komponentama

Imajte na umu sljedeće u donjem primjeru ovisnosti o komponentama:

  • Komponenta B mora definirati ovisnost putemmetoda ovisnosti o@Bilješka komponente.
  • ComponentA ne treba deklariratiModul B. Time su dvije komponente neovisne.
javna klasa ComponentDependency {@Component (modules = ModuleA.class) javno sučelje ComponentA {SomeClassA1 someClassA1 (); } @Component (modules = ModuleB.class, dependencies = ComponentA.class) javno sučelje ComponentB {SomeClassB1 someClassB1 (); } public static void main (String [] args) {ModuleA moduleA = new ModuleA (); ComponentA komponentaA = DaggerComponentDependency_ComponentA.builder () .moduleA (moduleA) .build (); ModuleB moduleB = novi ModuleB (); KomponentaB komponentaB = DaggerComponentDependency_ComponentB.builder () .moduleB (moduleB) .componentA (componentA) .build (); }}

Podkomponenta

U primjeru potkomponente imajte na umu sljedeće:

  • KaoKomponenta B nije definirala ovisnost oModulA, ne može živjeti neovisno. Ona postaje ovisna o komponenti koja će osiguratiModulA. Stoga ima a@Zabilješka podkomponente.
  • ComponentA je izjavilaModuleB putem metode sučeljakomponentaB (). Time su dvije komponente povezane. Zapravo,ComponentB se može inicijalizirati samo putemKomponentaA.
javna klasa SubComponent {@Component (modules = ModuleA.class) javno sučelje ComponentA {ComponentB komponentaB (ModuleB modulB); } @Podkomponenta (moduli = ModuleB.class) javno sučelje KomponentaB {SomeClassB1 someClassB1 (); } public static void main (String [] args) {ModuleA moduleA = new ModuleA (); ComponentA komponentaA = DaggerSubComponent_ComponentA.builder () .moduleA (moduleA) .build (); ModuleB moduleB = novi ModuleB (); KomponentaB komponentaB = komponentaA.comkomponentaB (modulB); }} 

Prema dokumentaciji:



Ovisnost o komponentama daje vam pristup samo vezama koje su izložene kao metode opskrbe kroz ovisnosti o komponentama, tj. Imate pristup samo vrstama koje su deklarirane u nadređenomKomponenta.

Podkomponenta vam daje pristup datoteci cijeli vezivanje grafa od roditelja kada je deklarirano, tj. imate pristup svim objektima deklariranim u njemuModuli.

Recimo, imateApplicationComponent sadrži sveStvari povezane s Androidom (LocationService,Resursi,SharedPreference itd.). Također želite imati svojeDataComponent s kojim zajedno upravljate stvarimaWebService za rješavanje API -ja. Jedino što vam nedostajeKomponenta podataka jeKontekst aplikacije koji se nalazi uApplicationComponent. Najjednostavniji način da dobijete aKontekst odDataComponent bi bila ovisnost oApplicationComponent. Morate biti sigurni da imateKontekst izričito deklariran uApplicationComponent jer imate pristup samo deklariranim stvarima. U ovom slučaju nema ručnog rada, što znači da ne morate navestiPodmoduli u roditeljuSastavite i izričito dodajte svoj podmodul u roditeljski modul, poput:

MySubcomponent mySubcomponent = myComponent.plus (novi ChildGraphModule ('dijete!')); // Nema potrebe!

Sada razmislite o slučaju u kojem želite ubrizgatiWebService izKomponenta podataka iLocationService odApplicationComponent u vašUlomak koji se veže pomoću@Podmodulplus gore navedena značajka. Zgodna stvar ovdje je što komponenta na koju se vežete (ApplicationComponent) radi ne potrebno razotkritiWebService nitiLocationService jer odmah imate pristup cijelom grafikonu.


Evo primjera koda sa snimkom zaslona za bolje razumijevanje komponente i podkomponente:

Komponenta: ovdje unesite opis slike

  1. AppComponent sadrži dvije deklaracije.
  2. AppComponent se inicijalizira u klasu App.
  3. HomeActivityComponent ovisi o AppComponent.
  4. U aplikaciji HomeActivity o inicijalizaciji DaggerHomeActivityComponent dajem objekt AppComponent kao sastav.

Podkomponenta:

ovdje unesite opis slike

  1. AppComponent sadrži podkomponente ili podkomponente.
  2. AppComponent se inicijalizira u klasu App.
  3. Podkomponenta ne zna za njegovu roditeljsku komponentu. To samo osiguravanjem vlastitih ovisnosti uključivanjem modula.
  4. U HomeActivity ubrizgavam potkomponentu pomoću njezine nadređene komponente.

I slikovni dijagram: ovdje unesite opis slike

Izvor: link