Sobes.tech
Middle

Kuo skiriasi kontrolės inversija (IoC) ir priklausomybių injekcija?

sobes.tech AI

Atsakymas iš AI

Valdymo inversija (IoC) — tai bendras projektavimo principas, pagal kurį programos valdymo srautas keičiasi: vietoj to, kad aiškiai valdytumėte priklausomybes ir jų kvietimo logiką, komponentas remiasi išoriniu karkasu ar konteineriu, kuris valdo šį srautą.

Priklausomybių injekcija (DI) yra vienas iš konkrečių modelių, įgyvendinančių IoC principą. Ji apima priklausomybių (objektų, nuo kurių priklauso dabartinis komponentas) perdavimą iš išorės, vietoj to, kad komponentas juos pats kuria ar ieško.

Taigi, DI yra būdas pasiekti IoC.

Pagrindiniai skirtumai:

  • IoC — principas/koncepcija.
  • DI — modelis/įgyvendinimas.
  • IoC gali būti įgyvendintas įvairiais būdais (pavyzdžiui, gamyklos metodas, paslaugų lokatorius), DI — vienas iš tokių būdų.
  • IoC perkelia atsakomybę už objektų kūrimą ir sujungimą komponento į karkasą/konteinerį.
  • DI įgyvendina šį perkėlimą perduodant priklausomybes per konstruktorių, nustatymo metodą ar sąsają.

DI pavyzdys (per konstruktorių):

// klasė, priklausanti nuo Service
public class Client {
    private final Service service;

    // Konstruktorius priima priklausomybę (Service)
    public Client(Service service) {
        this.service = service;
    }

    public void doSomething() {
        service.execute();
    }
}

// priklausomybės sąsaja
public interface Service {
    void execute();
}

// konkreti priklausomybės įgyvendinimas
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Vykdoma paslauga...");
    }
}

// klasė, atsakinga už "įdiegimą"
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // priklausomybės sukūrimas
        Client client = new Client(myService); // priklausomybės įdiegimas per konstruktorių
        client.doSomething();
    }
}

Šiame pavyzdyje klasė Client tiesiogiai nesukuria ServiceImpl. Vietoje to, ServiceImpl sukuriama kažkur kitur (AppConfig) ir perduodama (įdiegta) į Client per jo konstruktorių. Tai įgyvendina IoC principą, nes valdymas kuriant ir jungiant Service yra inversuotas — jis nėra Client.