En hurtig introduktion til afhængighedsinjektion: hvad det er, og hvornår det skal bruges

Foto af rawpixel på Unsplash

Introduktion

I software engineering er afhængighedsinjektion en teknik, hvor et objekt (eller statisk metode) leverer afhængighederne af et andet objekt. En afhængighed er et objekt, der kan bruges (en service).

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

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

Afhængighed eller afhængighed betyder at stole på noget for støtte. Som hvis 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, skal vi først forstå, hvad en afhængighed i programmering betyder.

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

Vis afhængighed mellem klasser

I Java, før vi kan bruge metoder til andre klasser, skal vi først oprette objektet for den 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.

Hvad hvis kode kunne tale?

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 grøfte MRFWheels i fremtiden og ønsker at bruge Yokohama Wheels?

Vi bliver nødt til at genskabe bilobjektet med en ny Yokohama-afhængighed. Men når vi bruger afhængighedsinjektion (DI), kan vi skifte hjul under kørsel (fordi afhængigheder kan indsprøjtes under kørsel snarere end på kompileringstid).

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

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

Der er dybest set 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. Kunder skal implementere en grænseflade, der afslører en sætningsmetode, der accepterer afhængigheden.

Så nu er det afhængighedsinjektionens ansvar for:

  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, ser DI på det, og det bør ikke vedrøre klassen, der bruger disse objekter. På denne måde, hvis objekterne ændrer sig i fremtiden, er dets DI's ansvar at levere de passende objekter til klassen.

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 udenfor.

Det er det femte princip i S.O.L.I.D - de 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 (enkelt sagt, hårdkodet).

I henhold til principperne skal en klasse koncentrere sig om at udføre sit ansvar og ikke på at skabe objekter, som den kræver for at udføre disse opgaver. Og det er her afhængighedsinjektion spiller ind: det giver klassen de nødvendige objekter.

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

Fordele ved at bruge DI

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

Ulemper ved DI

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

Du kan implementere afhængighedsinjektion på egen hånd (Pure Vanilla) eller bruge tredjepartsbiblioteker eller rammer.

Biblioteker og rammer, der implementerer DI

  • Forår (Java)
  • Google Guice (Java)
  • Dolk (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 - DI designmønster Eksempelvejledning - JournalDev

Brug af afhængighedsinjektion i Java - Introduktion - Tutorial - 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 den 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 nu er denne artikel blevet konverteret til det russiske sprog. Mine russiske venner, og som alle kan læse det russiske sprog, giver det en læsning.

Link til artiklen

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

Di-Ninja

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

knifecycle

Rediger 2:

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

Auryn

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

Hvis du lærte endda en ting eller to, skal du klappe dine hænder så mange gange (50 ) som du kan for at vise din støtte!