Middle
128
questionbank
Что такое инверсия зависимостей в контексте разработки на C#?
Answer from AI
sobes.tech AI
Принцип проектирования, согласно которому модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
В C# это обычно реализуется через:
- Использование интерфейсов или абстрактных классов для определения контрактов.
- Внедрение зависимостей (Dependency Injection) для предоставления конкретных реализаций через конструкторы, свойства или методы.
// Абстракция
public interface IMessageSender
{
void Send(string message);
}
// Низкоуровневый модуль (деталь)
public class EmailSender : IMessageSender
{
public void Send(string message)
{
// Логика отправки email
}
}
// Высокоуровневый модуль
public class NotificationManager
{
private readonly IMessageSender _sender;
// Зависимость внедряется через конструктор (Dependency Injection)
public NotificationManager(IMessageSender sender)
{
_sender = sender;
}
public void Notify(string message)
{
_sender.Send(message);
}
}
В этом примере NotificationManager (высокоуровневый модуль) зависит от абстракции IMessageSender, а не от конкретной реализации EmailSender (низкоуровневый модуль). Это делает NotificationManager более гибким и тестируемым, так как можно легко использовать разные реализации IMessageSender.