Барои чӣ истифода мешавад ворид кардани вобастагиҳо?
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 принсипи асосии сохтани барномаҳои осонтар, тестшаванда ва васеъшаванда мебошад.