Sobes.tech
Middle

За шта се користи уметање зависности?

sobes.tech АИ

Одговор од АИ

Uvođenje zavisnosti (Dependency Injection, DI) koristi se za upravljanje zavisnostima između komponenti aplikacije.

Glavni ciljevi DI:

  • Smanjenje povezanosti (Coupling): Komponente ne kreiraju svoje zavisnosti direktno, već ih dobijaju spolja. To čini komponente nezavisnijim i olakšava njihovu ponovnu upotrebu.
  • Poboljšanje testabilnosti: Izolovano testiranje pojedinačnih komponenti postaje lakše, jer se mogu koristiti mock objekti ili zamenice umesto stvarnih zavisnosti.
  • Povećanje fleksibilnosti i proširivosti: Lakše je zameniti implementacije zavisnosti bez promene koda komponenti koje ih koriste.
  • Pojednostavljenje konfiguracije: Zavisnosti mogu biti konfigurisane centralizovano, na primer prilikom pokretanja aplikacije.

Glavni pristupi DI:

  • Umetanje putem konstruktora (Constructor Injection): Zavisnosti se prosleđuju kao parametri konstruktora. Ovo je najrašireniji i preporučeni pristup, jer garantuje prisustvo svih potrebnih zavisnosti pri kreiranju objekta.

    // Zavisnost
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Komponenta sa zavisnošću
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Umetanje putem konstruktora
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Doing something.");
        }
    }
    
  • Umetanje putem svojstva (Property Injection): Zavisnosti se postavljaju putem javnih svojstava. Manje je preferirano, jer ne garantuje da će zavisnost biti postavljena.

    public class MyService
    {
        public ILogger Logger { get; set; } // Umetanje putem svojstva
    
        public void DoSomething()
        {
            Logger?.Log("Doing something."); // Provera na null
        }
    }
    
  • Umetanje putem metode (Method Injection): Zavisnosti se prosleđuju kao parametri metode. Koristi se kada je zavisnost potrebna samo za izvršenje određene metode.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Umetanje putem metode
        {
            logger.Log("Doing something.");
        }
    }
    

Često se DI implementira pomoću DI kontejnera (Inversion of Control Container), koji upravlja životnim ciklusom objekata i rešava njihove zavisnosti. Primeri popularnih DI kontejnera u .NET: Microsoft.Extensions.DependencyInjection (ugrađeni), Autofac, Ninject, Castle Windsor.

DI je ključni princip za izgradnju lako održivih, testabilnih i proširivih aplikacija.