Sobes.tech
Middle

Барои чӣ истифода мешавад ворид кардани вобастагиҳо?

sobes.tech AI

Ҷавоб аз AI

Вуруд кардани вобастагиҳо (Dependency Injection, DI) барои идоракунии вобастагиҳо байни компонентҳои барнома истифода мешавад.

Ҳадафҳои асосии DI:

  • Кам кардани пайвастагӣ (Coupling): Компонентҳо мустақиман вобастагиҳои худро намесозанд, балки онҳоро аз берун мегиранд. Ин компонентҳоро мустақилтар мекунад ва истифодаи такрорӣ онҳоро осонтар мекунад.
  • Беҳтар кардани тестгирӣ: Санҷиши мустақилонаи компонентҳо осонтар мешавад, зеро метавон объектҳои mock ё ҷойгузинҳоро ба ҷои вобастагиҳои воқеӣ истифода бурд.
  • Беҳтар кардани чандирӣ ва васеъшавӣ: Иҷозат дода мешавад, ки иҷрои вобастагиҳоро бе тағир додани коди компонентҳо, ки онҳоро истифода мебаранд, иваз кардан мумкин аст.
  • Осон кардани конфигуратсия: Вобастагиҳо метавонанд марказонидашуда танзим карда шаванд, масалан, ҳангоми оғоз кардани барнома.

Роҳҳои асосии DI:

  • Вуруд аз тариқи конструктор (Constructor Injection): Вобастагиҳо ҳамчун параметрҳо ба конструктор дода мешаванд. Ин усул маъмултарин ва тавсияшаванда аст, зеро он кафолат медиҳад, ки ҳама вобастагиҳои зарурӣ ҳангоми сохтани объект мавҷуданд.

    // Вобастагӣ
    public interface ILogger
    {
        void Log(string message);
    }
    
    // Компонент бо вобастагӣ
    public class MyService
    {
        private readonly ILogger _logger;
    
        public MyService(ILogger logger) // Вуруд аз тариқи конструктор
        {
            _logger = logger;
        }
    
        public void DoSomething()
        {
            _logger.Log("Doing something.");
        }
    }
    
  • Вуруд аз тариқи хусусият (Property Injection): Вобастагиҳо тавассути хусусиятҳои умумӣ танзим карда мешаванд. Ин усул камтар тавсия мешавад, зеро он кафолат намедиҳад, ки вобастагиҳо муқаррар шудаанд.

    public class MyService
    {
        public ILogger Logger { get; set; } // Вуруд аз тариқи хусусият
    
        public void DoSomething()
        {
            Logger?.Log("Doing something."); // Санҷиши null
        }
    }
    
  • Вуруд аз тариқи метод (Method Injection): Вобастагиҳо ҳамчун параметрҳои метод дода мешаванд. Ин усул истифода мешавад, вақте вобастагиҳо танҳо барои иҷрои методи мушаххас заруранд.

    public class MyService
    {
        public void DoSomething(ILogger logger) // Вуруд аз тариқи метод
        {
            logger.Log("Doing something.");
        }
    }
    

Ди бештар бо ёрии контейнери DI (Inversion of Control Container) амалӣ мешавад, ки ҳаёти циклро идора мекунад ва вобастагиҳоро ҳал мекунад. Мисолҳои маъруфи контейнерҳои DI дар .NET: Microsoft.Extensions.DependencyInjection (интегратсияшуда), Autofac, Ninject, Castle Windsor.

DI принсипи асосии сохтани барномаҳои осонтар, тестшаванда ва васеъшаванда мебошад.