En rask intro til Dependency Injection: hva det er, og når du skal bruke det

Introduksjon

I programvareteknikk er avhengighetsinjeksjon en teknikk der ett objekt (eller statisk metode) leverer avhengighetene til et annet objekt. En avhengighet er et objekt som kan brukes (en tjeneste).

Det er Wikipedia-definisjonen, men likevel, men det er ikke spesielt lett å forstå. Så la oss forstå det bedre.

Før vi forstår hva det betyr i programmering, la oss først se hva det generelt betyr, da det vil hjelpe oss å forstå konseptet bedre.

Avhengighet eller avhengig betyr å stole på noe for støtte. Som om jeg sier at vi stoler for mye på mobiltelefoner enn det betyr at vi er avhengige av dem.

Så før vi kommer til avhengighetsinjeksjoner , la oss først forstå hva en avhengighet i programmering betyr.

Når klasse A bruker noen funksjonalitet i klasse B, sa den at klasse A har en avhengighet av klasse B.

Før vi kan bruke metoder for andre klasser i Java, må vi først lage objektet til den klassen (dvs. klasse A trenger å lage en forekomst av klasse B).

Så, å overføre oppgaven med å lage objektet til noen andre og direkte bruke avhengigheten kalles avhengighetsinjeksjon.

Hvorfor skal jeg bruke avhengighetsinjeksjon?

La oss si at vi har en bilklasse som inneholder forskjellige gjenstander som hjul, motor osv.

Her er bilklassen ansvarlig for å lage alle avhengighetsobjektene. Nå, hva om vi bestemmer oss for å slippe MRFWheels i fremtiden og vil bruke Yokohama Wheels?

Vi må gjenskape bilobjektet med en ny avhengighet av Yokohama. Men når vi bruker avhengighetsinjeksjon (DI), kan vi bytte hjul på kjøretid (fordi avhengigheter kan injiseres ved kjøretid i stedet for på kompileringstid).

Du kan tenke på DI som mellommann i koden vår som gjør alt arbeidet med å lage det foretrukne hjulobjektet og levere det til bilklassen.

Det gjør vår bilklasse uavhengig av å lage gjenstander til hjul, batteri, etc.

Det er i utgangspunktet tre typer avhengighetsinjeksjon:

  1. konstruktørinjeksjon: avhengighetene blir gitt gjennom en klassekonstruktør.
  2. setterinjeksjon: klienten avslører en settermetode som injektoren bruker for å injisere avhengigheten.
  3. grensesnittinjeksjon: avhengigheten gir en injektormetode som vil injisere avhengigheten i enhver klient som sendes til den. Klienter må implementere et grensesnitt som avslører en settermetode som godtar avhengigheten.

Så nå er det avhengighetsinjeksjonens ansvar å:

  1. Lag objektene
  2. Vet hvilke klasser som krever disse gjenstandene
  3. Og gi dem alle disse gjenstandene

Hvis det er noen endring i objekter, så ser DI på det, og det skal ikke dreie seg om klassen som bruker disse objektene. På denne måten hvis objektene endres i fremtiden, så er DIs ansvar å gi de aktuelle objektene til klassen.

Inversjon av kontroll - konseptet bak DI

Dette sier at en klasse ikke skal konfigurere sine avhengigheter statisk, men skal konfigureres av en annen klasse utenfra.

Det er det femte prinsippet til SOLID - thefem grunnleggende prinsipper for objektorientert programmering og design av Uncle Bob - som sier at en klasse skal avhenge av abstraksjon og ikke av konkretjoner (i enkle termer, hardkodet).

I henhold til prinsippene bør en klasse konsentrere seg om å oppfylle sitt ansvar og ikke å skape objekter som den krever for å oppfylle disse ansvarsoppgavene. Og det er her avhengighetsinjeksjon spiller inn: det gir klassen de nødvendige objektene.

Merk: Hvis du vil lære om SOLID- prinsipper av Onkel Bob, kan du gå til denne lenken.

Fordeler med å bruke DI

  1. Hjelper i enhetstesting.
  2. Kjeleplatekoden reduseres, ettersom initialisering av avhengigheter gjøres av injektorkomponenten.
  3. Utvidelse av applikasjonen blir lettere.
  4. Hjelper med å aktivere løs kobling, noe som er viktig i applikasjonsprogrammering.

Ulemper med DI

  1. Det er litt komplisert å lære, og hvis det blir brukt for mye kan det føre til ledelsesproblemer og andre problemer.
  2. Mange kompileringsfeil blir presset til kjøretid.
  3. Avhengighetsinjeksjonsrammer implementeres med refleksjon eller dynamisk programmering. Dette kan hindre bruk av IDE-automatisering, for eksempel "finn referanser", "vis anropshierarki" og sikker refactoring.

Du kan implementere avhengighetsinjeksjon alene (Pure Vanilla) eller bruke tredjepartsbiblioteker eller rammer.

Biblioteker og rammeverk som implementerer DI

  • Vår (Java)
  • Google Guice (Java)
  • Dagger (Java og Android)
  • Castle Windsor (.NET)
  • Enhet (.NET)

For å lære mer om avhengighetsinjeksjon, kan du sjekke ut ressursene nedenfor:

Java Dependency Injection - DI Design Pattern Eksempelveiledning - JournalDev

Bruke avhengighetsinjeksjon i Java - Introduksjon - Veiledning - Vogella

Inversjon av kontrollbeholdere og avhengighetsinjeksjonsmønsteret - Martin Fowler

Håper det hjelper!

Hvis du likte artikkelen og vil lese flere fantastiske artikler, så følg meg her (Bhavya Karia) og vis din støtte da det motiverer meg til å skrive mer.

Hvis du har spørsmål eller tilbakemeldinger til meg, enn la oss koble til på LinkedIn, Twitter, Facebook.

Rediger 1:

Takket være Sergey Ufocoder er denne artikkelen nå konvertert til russisk. Mine russiske venner og som alle kan lese det russiske språket, leser det.

Lenke til artikkelen

Også, hvis du vil bruke DI i JavaScript og leter etter et bibliotek, foreslår Jo Surikat at du prøver biblioteket hans.

Di-Ninja

Nok et fantastisk DI-bibliotek i JavaScript ble foreslått av Nicolas Froidure.

knivsyklus

Rediger 2:

Hvis du er en PHP-utvikler, så ikke bekymre deg, fikk også alle dekket. Gordon Forsythe anbefalte dette fantastiske biblioteket som dere alle kanskje vil prøve ut.

auryn

Takk for alle de gode ordene jeg har mottatt. Del artikkelen slik at flere og flere mennesker kan dra nytte av det.

Hvis du lærte enda en ting eller to, kan du dele denne historien!