Sobes.tech
Middle+

Кадом усулҳо барои риояи принсипи ислоҳоти вобастагиро истифода мебаранд?

sobes.tech AI

Ҷавоб аз AI

Принципи инактиватсияи вобасозӣ (Dependency Inversion Principle, DIP) мегӯяд, ки:

  • Модулҳои сатҳи баланд бояд мустақиман ба модулҳои сатҳи паст такя накунанд.
  • Ҳар ду навъи модул бояд ба абстраксияҳо (масалан, интерфейсҳо) такя кунанд.
  • Абстраксияҳо набояд аз тафсилотҳо такя кунанд, тафсилотҳо бояд аз абстраксияҳо такя кунанд.

Барои риояи ин принсип дар C# истифодаи зерин роҳҳо истифода мешаванд:

  1. Истифодаи интерфейсҳо ва синфҳои абстрактӣ

    • Вобасозӣ тавассути интерфейсҳо, на тавассути реализацияҳои мушаххас.
  2. Вуруд кардани вобасозӣ (Dependency Injection, DI)

    • Вобасозӣ аз хориҷи синф (аз тариқи конструктор, хусусиятҳо ё усулҳо) дода мешавад ва дар дохили он сохта намешавад.
    • Ин имкон медиҳад, ки реализацияҳоро ба осонӣ иваз кардан ва тестҳоро содда кардан.
  3. Инактиватсияи идоракунӣ (Inversion of Control, IoC)

    • Назорат дар бораи сохтани ва пайваст кардани объектҳо ба контейнер ё рамзии беруна интиқол дода мешавад.
  4. Истифодаи контейнерҳои DI

    • Масалан, Microsoft.Extensions.DependencyInjection, Autofac, Ninject ва ғайра.
    • Онҳо давраҳои ҳаёт ва ҳал кардани вобасозиро идора мекунанд.

Масалан, дарвоситаи вобасозӣ тавассути конструктор:

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)
    {
        // логикаи эҷоди корбар
        _logger.Log($"Кори {name} эҷод шуд.");
    }
}

Дар ин мисол, UserService аз абстраксияи ILogger вобаста аст, ва реализацияи мушаххас ConsoleLogger аз хориҷ дода мешавад, ки ба принсипи инактиватсияи вобасозӣ мувофиқат мекунад.