Sobes.tech
Middle

Mire szolgál a függőséginjektálás (Dependency Injection)?

sobes.tech MI

Válasz az MI-től

A függőség-injektálás (Dependency Injection, DI) az alkalmazás komponensei közötti függőségek kezelésére szolgál.

A DI fő céljai:

  • A kötés (Coupling) csökkentése: A komponensek nem közvetlenül hozzák létre a függőségeiket, hanem kívülről kapják azokat. Ezáltal a komponensek függetlenebbé válnak, és könnyebben újrahasznosíthatók.
  • A tesztelhetőség javítása: Az egyes komponensek izolált tesztelése könnyebbé válik, mivel mock- vagy dummy-objektumokat lehet használni a valódi függőségek helyett.
  • A rugalmasság és bővíthetőség növelése: Könnyebb a függőségek implementációinak cseréje anélkül, hogy a függőségeket használó komponensek kódját módosítanánk.
  • A konfiguráció egyszerűsítése: A függőségek központilag konfigurálhatók, például az alkalmazás indításakor.

A DI fő megközelítései:

  • Konstruktoron keresztüli injektálás (Constructor Injection): A függőségek a konstruktor paramétereiként kerülnek átadásra. Ez a legelterjedtebb és ajánlott módszer, mivel garantálja, hogy az összes szükséges függőség rendelkezésre áll a objektum létrehozásakor.

    // Függőség
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Komponens függőséggel
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Konstruktoron keresztüli injektálás
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Valamit csinál.");
        }
    }
    
  • Tulajdonságon keresztüli injektálás (Property Injection): A függőségek nyilvános tulajdonságokon keresztül kerülnek beállításra. Kevésbé preferált, mivel nem garantálja, hogy a függőség beállításra került.

    public class MyService
    {
        public ILogger Logger { get; set; } // Tulajdonságon keresztüli injektálás
    
        public void DoSomething()
        {
            Logger?.Log("Valamit csinál."); // null-ellenőrzés
        }
    }
    
  • Metóduson keresztüli injektálás (Method Injection): A függőségek a metódus paramétereiként kerülnek átadásra. Akkor használják, amikor a függőség csak egy adott metódus végrehajtásához szükséges.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Metóduson keresztüli injektálás
        {
            logger.Log("Valamit csinál.");
        }
    }
    

A DI gyakran valósul meg DI-konténer (Inversion of Control Container) segítségével, amely kezeli az objektumok életciklusát és feloldja a függőségeket. Népszerű DI-konténerek a .NET-ben: Microsoft.Extensions.DependencyInjection (beépített), Autofac, Ninject, Castle Windsor.

A DI kulcsfontosságú elv a könnyen karbantartható, tesztelhető és bővíthető alkalmazások építéséhez.