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