Sobes.tech
Middle

Jak używasz wstrzykiwania zależności w swoich projektach?

sobes.tech AI

Odpowiedź od AI

Używam DI do zarządzania zależnościami komponentów aplikacji. To zwiększa testowalność, modularność i elastyczność kodu.

Główne metody, które stosuję w DI:

  • Wstrzykiwanie przez konstruktor: Metoda preferowana, ponieważ zależności stają się obowiązkowe i jawne.
  • Wstrzykiwanie przez setter: Używane dla zależności opcjonalnych lub gdy pracujemy z frameworkami wymagającymi setterów.
  • Wstrzykiwanie przez pole: Często stosowane w scenariuszach testowych lub z frameworkami obsługującymi wstrzykiwanie adnotacji bezpośrednio do pól.

Aktywnie korzystam z frameworków obsługujących DI, takich jak Spring czy Guice.

Przykład wstrzykiwania przez konstruktor w Spring:

// Serwis zależny od innego serwisu
@Service
public class OrderService {

    private final InventoryService inventoryService;

    // Wstrzykiwanie zależności przez konstruktor
    @Autowired
    public OrderService(InventoryService inventoryService) {
        this.inventoryService = inventoryService;
    }

    public void placeOrder(String item, int quantity) {
        // Użycie wstrzykniętej zależności
        inventoryService.reserveItem(item, quantity);
        // ... dodatkowa logika
    }
}

// Inny serwis do wstrzyknięcia
@Service
public class InventoryService {
    public void reserveItem(String item, int quantity) {
        // Logika rezerwacji
    }
}

Przykład wstrzykiwania przez setter w Spring:

@Component
public class ReportGenerator {

    private ReportFormatter formatter;

    @Autowired // Opcjonalnie, jeśli jest tylko jeden setter
    public void setFormatter(ReportFormatter formatter) {
        this.formatter = formatter;
    }

    public void generateReport() {
        // Użycie wstrzykniętej zależności przez setter
        formatter.format("Dane raportu");
    }
}

@Component
public class ReportFormatter {
    public String format(String data) {
        return "Sformatowane: " + data;
    }
}

Przykład wstrzykiwania przez pole w Spring:

@Component
public class UserController {

    @Autowired // Wstrzykiwanie bezpośrednio do pola
    private UserService userService;

    public User findUser(Long id) {
        return userService.findUserById(id);
    }
}

@Service
public class UserService {
    public User findUserById(Long id) {
        // Logika wyszukiwania użytkownika po ID
        return new User(id, "Testowy użytkownik");
    }
}

class User {
    private Long id;
    private String name;

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

Porównanie podejść:

Metoda wstrzykiwania Zalety Wady Zastosowanie
Konstruktor Jawne, obowiązkowe zależności, łatwe do testowania Może prowadzić do "przeładowanych" konstruktorów Zobowiązujące zależności
Setter Opcjonalne zależności, wygoda konfiguracji Zależność nie jest obowiązkowa, wymaga wywołania settera Opcjonalne zależności, frameworki
Pole Zwięzła składnia Narusza zasady enkapsulacji, trudniejsze do ręcznego testowania Testy, frameworki

DI pozwala mi tworzyć aplikacje z bardziej elastyczną i łatwiejszą do utrzymania architekturą.