Middle+
Кадом усулҳо барои риояи принсипи ислоҳоти вобастагиро истифода мебаранд?
sobes.tech AI
Ҷавоб аз AI
Принципи инактиватсияи вобасозӣ (Dependency Inversion Principle, DIP) мегӯяд, ки:
- Модулҳои сатҳи баланд бояд мустақиман ба модулҳои сатҳи паст такя накунанд.
- Ҳар ду навъи модул бояд ба абстраксияҳо (масалан, интерфейсҳо) такя кунанд.
- Абстраксияҳо набояд аз тафсилотҳо такя кунанд, тафсилотҳо бояд аз абстраксияҳо такя кунанд.
Барои риояи ин принсип дар C# истифодаи зерин роҳҳо истифода мешаванд:
-
Истифодаи интерфейсҳо ва синфҳои абстрактӣ
- Вобасозӣ тавассути интерфейсҳо, на тавассути реализацияҳои мушаххас.
-
Вуруд кардани вобасозӣ (Dependency Injection, DI)
- Вобасозӣ аз хориҷи синф (аз тариқи конструктор, хусусиятҳо ё усулҳо) дода мешавад ва дар дохили он сохта намешавад.
- Ин имкон медиҳад, ки реализацияҳоро ба осонӣ иваз кардан ва тестҳоро содда кардан.
-
Инактиватсияи идоракунӣ (Inversion of Control, IoC)
- Назорат дар бораи сохтани ва пайваст кардани объектҳо ба контейнер ё рамзии беруна интиқол дода мешавад.
-
Истифодаи контейнерҳои 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 аз хориҷ дода мешавад, ки ба принсипи инактиватсияи вобасозӣ мувофиқат мекунад.