Sobes.tech
Middle+

Kokie požiūriai naudojami siekiant laikytis priklausomybių inversijos principo?

sobes.tech AI

Atsakymas iš AI

Principas, vadinamas priklausomybių inversijos principu (Dependency Inversion Principle, DIP), reiškia, kad:

  • Aukšto lygio moduliai neturėtų tiesiogiai priklausyti žemo lygio moduliams.
  • Abu moduliai turėtų priklausyti nuo abstrakcijų (pavyzdžiui, sąsajų).
  • Abstrakcijos neturėtų priklausyti nuo detalių, detalės turėtų priklausyti nuo abstrakcijų.

Šiam principui laikytis C# taikomi šie požiūriai:

  1. Sąsajų ir abstrakčių klasių naudojimas

    • Priklausomybės deklaruojamos per sąsajas, o ne konkrečias realizacijas.
  2. Priklausomybių injekcija (Dependency Injection, DI)

    • Priklausomybės perduodamos klasei iš išorės (per konstruktorių, savybes ar metodus), o ne kuriamos viduje.
    • Tai leidžia lengvai keisti realizacijas ir palengvina testavimą.
  3. Valdymo inversija (Inversion of Control, IoC)

    • Objekto kūrimo ir jungimo kontrolė perduodama išoriniam konteineriui ar karkasui.
  4. Naudojant DI konteinerius

    • Pavyzdžiui, Microsoft.Extensions.DependencyInjection, Autofac, Ninject ir kt.
    • Jie valdo objekto gyvavimo ciklą ir priklausomybių sprendimą.

Pavyzdys, kaip naudoti priklausomybių injekciją per konstruktorių:

public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message) => Console.WriteLine(message);
}

public class UserService
{
    private readonly ILogger _logger;

    public UserService(ILogger logger)
    {
        _logger = logger;
    }

    public void CreateUser(string name)
    {
        // naudotojo kūrimo logika
        _logger.Log($"Vartotojas {name} sukurtas.");
    }
}

Šiame pavyzdyje UserService priklauso nuo abstrakčios sąsajos ILogger, o konkreti ConsoleLogger realizacija yra perduodama iš išorės, kas atitinka priklausomybių inversijos principą.