Sobes.tech
Middle

Kāda ir atšķirība starp kontroli inversiju (IoC) un atkarību injekciju?

sobes.tech AI

Atbilde no AI

Vadības inversija (IoC) — tas ir kopīgs projektēšanas princips, saskaņā ar kuru programmas vadības plūsma mainās: vietā, lai skaidri pārvaldītu atkarības un to izsaukšanas loģiku, komponentu balstās uz ārēju ietvaru vai konteineru, kas pārvalda šo plūsmu.

Atkarību injekcija (DI) ir viens no konkrētiem modeļiem, kas īsteno IoC principu. Tas ietver atkarību (objektu, no kuriem ir atkarīgs pašreizējais komponents) nodošanu no ārpuses, nevis to, ka komponents tās pats izveido vai meklē.

Tādējādi, DI ir veids, kā sasniegt IoC.

Galvenās atšķirības:

  • IoC — princips/koncepcija.
  • DI — modelis/īstenojums.
  • IoC var tikt īstenots dažādos veidos (piemēram, rūpnīcas metode, pakalpojumu lokators), DI — viens no šādiem veidiem.
  • IoC pārnes atbildību par objektu izveidi un sasaisti no komponenta uz ietvaru/konteineru.
  • DI īsteno šo pārnesi, nododot atkarības caur konstruktoru, iestatīšanas metodi vai interfeisu.

DI piemērs (caur konstruktoru):

// klase, kas ir atkarīga no Service
public class Client {
    private final Service service;

    // Konstruktorā tiek pieņemta atkarība (Service)
    public Client(Service service) {
        this.service = service;
    }

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

// atkarības interfeiss
public interface Service {
    void execute();
}

// konkrēta atkarības īstenošana
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Pakalpojuma izpilde...");
    }
}

// klase, kas ir atbildīga par "ieviešanu"
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // atkarības izveide
        Client client = new Client(myService); // atkarības ieviešana caur konstruktoru
        client.doSomething();
    }
}

Šajā piemērā klase Client tieši neizveido ServiceImpl. Tā vietā, ServiceImpl tiek izveidots citur (AppConfig) un nodots (ievadīts) Client caur tā konstruktoru. Tas īsteno IoC principu, jo vadība par Service izveidi un sasaisti ir invertēta — tas nav Client.