Umetanje zavisnosti – *Dependency Injection*

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 – 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

Close Menu
Show Buttons
Hide Buttons