Umetanje zavisnosti – *Dependency Injection*

Umetanje zavisnosti – Dependency Injection

Igor Dejanović

Fakultet tehničkih nauka u Novom Sadu
Katedra za informatiku

 

Sadržaj

 

 

Motivacija

  • Objekti iole složenijih aplikacija formiraju složene grafove zavisnosti.
  • Kako objekat „dobija“ reference na zavisne objekte?

 

 

Klasičan pristup dobavljanja referenci

public class RealBillingService implements BillingService{
  @Override
  public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard){
    CreditCardProcessor processor = new PaypalCreditCardProcessor();
    TransactionLog transactionLog = new DatabaseTransactionLog();
    try {
      ChargeResult result = processor.charge(creditCard, order.getAmount());
      transactionLog.logChargeResult(result);
      return result.wasSuccessful()
        ? Receipt.forSuccessfulCharge(order.getAmount())
        : Receipt.forDeclinedCharge(result.getDeclineMessage());
      } catch (UnreachableException e) {
        transactionLog.logConnectException(e);
        return Receipt.forSystemFailure(e.getMessage());
    }
  }
}

Upotreba Singleton/Factory obrasca

Singleton/Factory – testiranje

 

Upotreba Singleton/Factory obrasca – problemi

  • Deljena referenca – moramo posebno da pazimo da je postavljamo na prave vrednosti.
  • Nemoguće paralelizovati testove.

Singleton/Factory – testiranje

 

Upotreba Singleton/Factory obrasca – problemi

  • Deljena referenca – moramo posebno da pazimo da je postavljamo na prave vrednosti.
  • Nemoguće paralelizovati testove.

 

 

 

Dependency Injection

Umetanje zavisnosti – Dependency Injection

  • Izmeštanje nadležnosti za dobavljanje referenci van objekta – neko drugi će se brinuti da „umetne“ reference pre njihove upotrebe.
  • Prednosti:
    • Kod se pojednostavljuje. Zavisnost između klasa je bazirana na apstraktnim interfejsima što pozitivno utiče na održavanje (maintability), ponovnu iskoristljivost (reusability) i podelu posla i nadležnosti.
    • Objekat će do trenutka poziva njegovih servisnih metoda već biti na odgovarajući način inicijalizovan. Smanjuje se tzv. boilerplatekod.
    • Testiranje je daleko jednostavnije. Kreiranje „lažnih“ objekata (mockup) je moguće i jednostavno se izvodi. Moguća paralelizacija testova.

 

Mehanizmi umetanja zavisnosti

  • Putem parametara konstruktora.
  • Putem mutator metoda (setters).
  • Putem implementiranog interfejsa.

 

Injekcija putem parametara konstruktora

Client(Service service) {
    this.service = service;
}

Injekcija putem setter metoda

public void setService(Service service){
  this.service = service;
}

Injekcija putem interfejsa

public interface ServiceSetter{
    public void setService(Service service);
}
public class client implements ServiceSetter{
    private Service service;
    @Override
    public void setService(Service service){
        this.service = service;
    }
}

Upotreba DI

Upotreba DI – testiranje

DI kontejneri

  • DI se može implementirati i bez posebnog alata/okvira.
  • DI kontejneri omogućavaju nametanje određenih konvencija za primenu ovog obrasca.
  • Korišćenje DI kontejera donosi određene prednosti:
    • Upotreba najbolje prakse
    • Standardizacija

 

DI kontejneri za Javu

  • Google Guice
  • PicoContainer
  • Spring

 

Standardizacija za programski jezik Java

  • JSR-330 1
  • Definiše skup standardnih Java anotacija za DI:
    • Provider<T> – Provides instances of T
    • Inject – Identifies injectable constructors, methods, and fields.
    • Named – String-based qualifier.
    • Qualifier – Identifies qualifier annotations.
    • Scope – Identifies scope annotations.
    • Singleton – Identifies a type that the injector only instantiates once.

 

Google Guice

  • Lightweight okvir za DI u Javi.
  • Razvijen od strane Google-a.
  • Konfiguracija bazirana na Java anotacijama.

 

 

Injekcija putem konstruktora

 

 

 

Konfiguracija za povezivanje – binding/wiring

 

Upotreba kontejnera

 

Linked Bindings

 

 

Custom Bindings Annotations

 

@Named Binding Annotation

 

 

Instance Bindings

 

 

@Provides Methods

 

 

Provider Bindings

 

 

Scopes

 

 

Injector

Jednostavan primer

 

 

Složeniji primer

 

 

Flask injector

  • Veza između injector biblioteke i Flask okvira za razvoj.

 

Primer upotrebe

 

http://www.igordejanovic.net/courses/tech/dependency-injection.html#41

Reference

Comments

comments

Umetanje zavisnosti – *Dependency Injection*

Umetanje zavisnosti – Dependency Injection

Igor Dejanović

Fakultet tehničkih nauka u Novom Sadu
Katedra za informatiku

 

Sadržaj

 

 

Motivacija

  • Objekti iole složenijih aplikacija formiraju složene grafove zavisnosti.
  • Kako objekat „dobija“ reference na zavisne objekte?

 

 

Klasičan pristup dobavljanja referenci

public class RealBillingService implements BillingService{
  @Override
  public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard){
    CreditCardProcessor processor = new PaypalCreditCardProcessor();
    TransactionLog transactionLog = new DatabaseTransactionLog();
    try {
      ChargeResult result = processor.charge(creditCard, order.getAmount());
      transactionLog.logChargeResult(result);
      return result.wasSuccessful()
        ? Receipt.forSuccessfulCharge(order.getAmount())
        : Receipt.forDeclinedCharge(result.getDeclineMessage());
      } catch (UnreachableException e) {
        transactionLog.logConnectException(e);
        return Receipt.forSystemFailure(e.getMessage());
    }
  }
}

Upotreba Singleton/Factory obrasca

Singleton/Factory – testiranje

 

Upotreba Singleton/Factory obrasca – problemi

  • Deljena referenca – moramo posebno da pazimo da je postavljamo na prave vrednosti.
  • Nemoguće paralelizovati testove.

Singleton/Factory – testiranje

 

Upotreba Singleton/Factory obrasca – problemi

  • Deljena referenca – moramo posebno da pazimo da je postavljamo na prave vrednosti.
  • Nemoguće paralelizovati testove.

 

 

 

Dependency Injection

Umetanje zavisnosti – Dependency Injection

  • Izmeštanje nadležnosti za dobavljanje referenci van objekta – neko drugi će se brinuti da „umetne“ reference pre njihove upotrebe.
  • Prednosti:
    • Kod se pojednostavljuje. Zavisnost između klasa je bazirana na apstraktnim interfejsima što pozitivno utiče na održavanje (maintability), ponovnu iskoristljivost (reusability) i podelu posla i nadležnosti.
    • Objekat će do trenutka poziva njegovih servisnih metoda već biti na odgovarajući način inicijalizovan. Smanjuje se tzv. boilerplatekod.
    • Testiranje je daleko jednostavnije. Kreiranje „lažnih“ objekata (mockup) je moguće i jednostavno se izvodi. Moguća paralelizacija testova.

 

Mehanizmi umetanja zavisnosti

  • Putem parametara konstruktora.
  • Putem mutator metoda (setters).
  • Putem implementiranog interfejsa.

 

Injekcija putem parametara konstruktora

Client(Service service) {
    this.service = service;
}

Injekcija putem setter metoda

public void setService(Service service){
  this.service = service;
}

Injekcija putem interfejsa

public interface ServiceSetter{
    public void setService(Service service);
}
public class client implements ServiceSetter{
    private Service service;
    @Override
    public void setService(Service service){
        this.service = service;
    }
}

Upotreba DI

Upotreba DI – testiranje

DI kontejneri

  • DI se može implementirati i bez posebnog alata/okvira.
  • DI kontejneri omogućavaju nametanje određenih konvencija za primenu ovog obrasca.
  • Korišćenje DI kontejera donosi određene prednosti:
    • Upotreba najbolje prakse
    • Standardizacija

 

DI kontejneri za Javu

  • Google Guice
  • PicoContainer
  • Spring

 

Standardizacija za programski jezik Java

  • JSR-330 1
  • Definiše skup standardnih Java anotacija za DI:
    • Provider<T> – Provides instances of T
    • Inject – Identifies injectable constructors, methods, and fields.
    • Named – String-based qualifier.
    • Qualifier – Identifies qualifier annotations.
    • Scope – Identifies scope annotations.
    • Singleton – Identifies a type that the injector only instantiates once.

 

Google Guice

  • Lightweight okvir za DI u Javi.
  • Razvijen od strane Google-a.
  • Konfiguracija bazirana na Java anotacijama.

 

 

Injekcija putem konstruktora

 

 

 

Konfiguracija za povezivanje – binding/wiring

 

Upotreba kontejnera

 

Linked Bindings

 

 

Custom Bindings Annotations

 

@Named Binding Annotation

 

 

Instance Bindings

 

 

@Provides Methods

 

 

Provider Bindings

 

 

Scopes

 

 

Injector

Jednostavan primer

 

 

Složeniji primer

 

 

Flask injector

  • Veza između injector biblioteke i Flask okvira za razvoj.

 

Primer upotrebe

 

http://www.igordejanovic.net/courses/tech/dependency-injection.html#41

Reference

Comments

comments