En hurtig introduktion til Dependency Injection: hvad det er, og hvornår man skal bruge det

Introduktion

I softwareteknik er afhængighedsinjektion en teknik, hvorved et objekt (eller statisk metode) leverer afhængigheder af et andet objekt. En afhængighed er et objekt, der kan bruges (en tjeneste).

Det er Wikipedia-definitionen, men stadig, men det er ikke særlig let at forstå. Så lad os forstå det bedre.

Før vi forstår, hvad det betyder i programmering, skal vi først se, hvad det generelt betyder, da det hjælper os med at forstå konceptet bedre.

Afhængighed eller afhængig betyder at stole på noget for støtte. Som om jeg siger, at vi stoler for meget på mobiltelefoner, end det betyder, at vi er afhængige af dem.

Så før vi kommer til afhængighedsinjektioner , lad os først forstå, hvad en afhængighed i programmering betyder.

Når klasse A bruger en vis funktionalitet i klasse B, siges det, at klasse A har en afhængighed af klasse B.

Før vi kan bruge metoder til andre klasser i Java, skal vi først oprette objektet for denne klasse (dvs. klasse A skal oprette en forekomst af klasse B).

Så at overføre opgaven med at oprette objektet til en anden og direkte bruge afhængigheden kaldes afhængighedsinjektion.

Hvorfor skal jeg bruge afhængighedsinjektion?

Lad os sige, at vi har en bilklasse, der indeholder forskellige genstande såsom hjul, motor osv.

Her er bilklassen ansvarlig for at skabe alle afhængighedsobjekter. Hvad nu, hvis vi beslutter at droppe MRFWheels i fremtiden og vil bruge Yokohama Wheels?

Vi bliver nødt til at genskabe bilgenstanden med en ny Yokohama-afhængighed. Men når vi bruger afhængighedsinjektion (DI), kan vi ændre hjulene ved kørselstid (fordi afhængigheder kan injiceres ved kørsel i stedet for på kompileringstidspunktet).

Du kan tænke på DI som mellemmanden i vores kode, der gør alt arbejdet med at skabe det foretrukne hjulobjekt og levere det til bilklassen.

Det gør vores bilklasse uafhængig af at skabe genstande fra hjul, batteri osv.

Der er grundlæggende tre typer afhængighedsinjektion:

  1. konstruktørinjektion: afhængighederne leveres gennem en klassekonstruktør.
  2. setterinjektion: klienten udsætter en settermetode, som injektoren bruger til at injicere afhængigheden.
  3. interfaceinjektion: afhængigheden tilvejebringer en injektormetode, der vil injicere afhængigheden i enhver klient, der sendes til den. Klienter skal implementere en grænseflade, der udsætter en setter-metode, der accepterer afhængigheden.

Så nu er det afhængighedsinjektionens ansvar at:

  1. Opret objekterne
  2. Ved hvilke klasser der kræver disse objekter
  3. Og give dem alle disse objekter

Hvis der er nogen ændring i objekter, så ser DI på det, og det skal ikke vedrøre den klasse, der bruger disse objekter. Denne måde, hvis objekterne ændres i fremtiden, så er dens DI's ansvar at give klassen de relevante objekter.

Inversion af kontrol - konceptet bag DI

Dette siger, at en klasse ikke skal konfigurere sine afhængigheder statisk, men skal konfigureres af en anden klasse udefra.

Det er det femte princip i SOLID -fem grundlæggende principper for objektorienteret programmering og design af Onkel Bob - som siger, at en klasse skal afhænge af abstraktion og ikke af konkretioner (i enkle vendinger, hårdkodet).

I henhold til principperne skal en klasse koncentrere sig om at opfylde sit ansvar og ikke skabe objekter, som det kræver for at opfylde disse forpligtelser. Og det er her afhængighedsindsprøjtning kommer i spil: det giver klassen de krævede objekter.

Bemærk: Hvis du vil lære om SOLID- principper af onkel Bob, kan du gå til dette link.

Fordele ved at bruge DI

  1. Hjælper med enhedstest.
  2. Kedelpladekoden reduceres, da initialisering af afhængigheder udføres af injektorkomponenten.
  3. Udvidelse af applikationen bliver lettere.
  4. Hjælper med at aktivere løs kobling, hvilket er vigtigt i applikationsprogrammering.

Ulemper ved DI

  1. Det er lidt komplekst at lære, og hvis overforbrug kan føre til ledelsesproblemer og andre problemer.
  2. Mange kompileringstidsfejl skubbes til kørselstid.
  3. Afhængighedsindsprøjtningsrammer implementeres med refleksion eller dynamisk programmering. Dette kan hindre brugen af ​​IDE-automatisering, såsom "find referencer", "vis opkaldshierarki" og sikker refactoring.

Du kan implementere afhængighedsinjektion på egen hånd (ren vanilje) eller bruge tredjepartsbiblioteker eller -rammer.

Biblioteker og rammer, der implementerer DI

  • Forår (Java)
  • Google Guice (Java)
  • Dagger (Java og Android)
  • Castle Windsor (.NET)
  • Enhed (.NET)

For at lære mere om afhængighedsinjektion kan du tjekke nedenstående ressourcer:

Java-afhængighedsinjektion - Eksempel på vejledning til DI-designmønster - JournalDev

Brug af afhængighedsinjektion i Java - Introduktion - Vejledning - Vogella

Inversion af kontrolbeholdere og afhængighedsinjektionsmønsteret - Martin Fowler

Håber det hjælper!

Hvis du kunne lide artiklen og vil læse flere fantastiske artikler, så følg mig her (Bhavya Karia) og vis din støtte, da det motiverer mig til at skrive mere.

Hvis du har spørgsmål eller feedback til mig, end lad os oprette forbindelse på LinkedIn, Twitter, Facebook.

Rediger 1:

Takket være Sergey Ufocoder er denne artikel nu blevet konverteret til det russiske sprog. Mine russiske venner, og som alle kan læse det russiske sprog, læser det.

Link til artiklen

Hvis du også vil anvende DI i JavaScript og leder efter et bibliotek, foreslår Jo Surikat, at du prøver hans bibliotek.

Di-Ninja

Endnu et fantastisk DI-bibliotek i JavaScript blev foreslået af Nicolas Froidure.

knivcykel

Rediger 2:

Hvis du er en PHP-udvikler, skal du ikke bekymre dig, fik også alle dækket. Gordon Forsythe anbefalede dette fantastiske bibliotek, som I alle måske vil prøve.

auryn

Tak for alle de venlige ord, jeg har modtaget. Del artiklen, så flere og flere mennesker kan drage fordel.

Hvis du selv har lært en ting eller to, så del denne historie!