## Dependency Injection
###### (Inversion of Control)
## Auto daten sammeln
![](assets/example.png)
### Diagram
![](assets/diagram.png)
## Insert Window
```
private CarService carService;
.
.
.
Car car = carService.create(carMap);
```
### Reicht das?
## Factory
```
Factory factory = Factory.getInstance();
carService = factory.getCarService("Metric");
```
### Problem ?
Das insert window wird ständig geändert
## Constructor Injection
```
public InsertWindow(CarService carService) {
this.carService = carService;
}
```
* Einfach zu testen
* Festlegung wird erzwungen
## Setter Injection
```
class InsertWindow {
setCarService(CarService carService) {
this.carService = carService;
}
}
```
* Kann da sein. Muss nicht.
* Einfach zu testen
## Injection with Annotations
```
class InsertWindow {
@Inject
private CarService carService;
}
```
* Änderungen am file bleiben klein
* immer da
* Framework wird benötigt
* Test Framework benötigt
## Testing
* testing von insert window einfacher
* testing ohne echte impl möglich
## Mocking
* Vorgauckeln einer Impelmentation
* sehr einfache Impelmentation zum testen
```
carService = new CarService() {
@Override
public Car create(Map data) throws InvalidInputException {return null;}
@Override
public Map translate(Car car) {return null;}
@Override
public String getUnitOfMesurement(CarAttribute carAttribute) {
return "testUnit";
}
};
```
## Frameworks
* Spring Boot
* Google Guice
* AngularJS
## Vorteile
* Macht Auteilung von Aufgaben leichter
* Verhalten fix, Verarbeitung nicht
* Parameterisierbar ohne Compilieren
* Seperation of Conserns
* Lose Kopplung
## Nachteile
* Code lesen manchmal schwierig
* Abhängigkeiten machmal kompliziert verlinkt
* Macht abhängig vom jeweilige Framework