Dependency Injection este separarea obiectelor care fac să fie dependente, furnizându-le să fie date din exterior (cum ar fi un parametru). În acest fel, eliminați dependența sau minimizați dependența.

Dacă este folosită metode de constructor în timpul executării dependency injection, se numește „Constructor Injection”. Dacă este utilizată setter funcțiilor în timpul executării injecției de dependență, se numește „Setter Injection” sau „Field Injection”.

De asemenea, este mai bine dacă examinați „Dependența”, am explicat-o aici (Subiect de Composition) în limba turcă.

Să ne gândim că o clasă de mașina și o clasă de motor. Putem spune aici că clasa mașinii depinde de clasa motorului. Deci, aceasta este o dependență. Să arătăm asta pe Kotlin.

class Masina
{
    var motor = Motor()
    
    fun porneste()
    {
        motor.porneste()
    }
}

class Motor
{
    fun porneste()
    {
        println("Motorul funcționează..")
    }
}

fun main(args: Array<String>)
{
    var masina = Masina()
    masina.porneste()
}


Clasa mașina depinde de clasa motorul. Deci, am dori să eliminăm această dependență. În primul rând, să-l eliminăm prin „Constructor Injection”.

class Masina(var motor:Motor)
{   
    fun porneste()
    {
        motor.porneste()
    }
}

class Motor
{
    fun porneste()
    {
        println("Motorul funcționează..")
    }
}

fun main(args: Array<String>)
{
    var motor = Motor()
    var masina = Masina(motor)
    masina.porneste()
}


Am folosit aici parametrul motorului ca parametru. L-am injectat în loc să depindem de el. Să executăm și dependency injection prin setting funcțiilor.

class Masina
{
    lateinit var motor : Motor
    
    fun porneste()
    {
        motor.porneste()
    }
}

class Motor
{
    fun porneste()
    {
        println("Motorul funcționează..")
    }
}

fun main(args: Array<String>)
{
    var masina = Masina()
    masina.motor = Motor()
    masina.porneste()
}


Am executat dependency injection prin „field injection” Acum, când moștenim o clasă numită hybridMotor din clasa motorului. Putem folosi această clasă hybridMotor fără a schimba nimic datorită injectării dependenței.

class Masina(var motor : Motor)
{    
    fun porneste()
    {
        motor.porneste()
    }
}

open class Motor
{
    open fun porneste()
    {
        println("Motorul funcționează..")
    }
}

class hybridMotor : Motor()
{
    override fun porneste()
    {
        println("Motorul hibrid funcționează..")
    }
}

fun main(args: Array<String>)
{
    var hybridmotor = hybridMotor()
    var masina = Masina(hybridmotor)
    masina.porneste()   
}


Vă rugăm să fiți atenți, am folosit clasa de motorHybrid fără nicio schimbare a clasei de Masina.

 
Deci, de ce Dependency Injection și de ce vrem să scăpăm de aceste dependențe?

După cum sa văzut mai sus, atunci când o clasă este dependentă de o altă clasă, o schimbare a clasei dependente necesită și o schimbare a clasei dependente. Poate că în exemplul nostru de mai sus, această dependență pentru o singură clasă poate fi rezolvată fără dependency injection. Cu toate acestea, având în vedere că există mai multe astfel de clase, aceasta nu ar fi deloc o soluție bună.

Dependency Injection facilitează lizibilitatea, mentenabilitatea, flexibilitatea și testabilitatea codului.