• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Dependency Inversion Principle: Designing Code That Adapts, Not Breaks

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
"Your business logic shouldn’t know how an email is sent — only that a notification needs to happen."

Of all the SOLID principles, the Dependency Inversion Principle (DIP) is perhaps the most architectural.
It’s not about syntax — it’s about control, flexibility, and future-proofing your code.

What does DIP really mean?
“High-level modules should not depend on low-level modules. Both should depend on abstractions.”
“Abstractions should not depend on details. Details should depend on abstractions.”

In simpler terms:

Your business logic shouldn't know or care about the specific implementation details

It should rely on interfaces, not classes

That’s how you design software that survives change

The problem: direct dependency on concrete classes

public class OrderService {
private readonly EmailService _email;


public OrderService() {
_email = new EmailService();
}

public void Process() {
// business logic
_email.SendConfirmation();
}

}
At first glance, it works. But under the hood:

OrderService is tightly coupled to EmailService

You can’t swap to SMS, WhatsApp, or Push without rewriting core logic

You can’t test this class without setting up real email behavior

You’re violating the DIP

The fix: invert the dependency using interfaces

public interface INotificationService {
void SendConfirmation();
}

public class EmailService : INotificationService {
public void SendConfirmation() {
// send email
}
}
Now in OrderService:

public class OrderService {
private readonly INotificationService _notification;


public OrderService(INotificationService notification) {
_notification = notification;
}

public void Process() {
// business logic
_notification.SendConfirmation();
}

}

You’ve inverted the dependency:

Now OrderService depends on what should happen, not how

Email, SMS, Push — all are plug-and-play

Testing becomes easy with mocks and stubs

A real-world analogy
Imagine your team writes code to log events.
One day it logs to a file. Tomorrow it might be a database. Later, maybe a cloud service.

If every piece of logic directly uses FileLogger, you’re stuck.

But if everything uses ILogger, you can change implementation without touching the logic.

That’s DIP in action.

Signs you're violating DIP
Classes directly new up other services

Business logic knows about HttpClient, DbContext, or EmailService

You can’t easily swap one implementation for another

Your unit tests are bloated because everything is too coupled

Benefits of applying DIP
✔ Clean, independent domain logic
✔ Flexible integrations (switch services, libraries, APIs)
✔ Reliable and fast unit testing
✔ Seamless support for multiple environments (dev, test, prod)
✔ Scalable architecture with clear boundaries

Bonus: Combine DIP with DI (Dependency Injection)
Using .NET’s built-in DI:

builder.Services.AddScoped();
builder.Services.AddScoped();
Now OrderService gets the correct implementation automatically — and you can swap it with one line of config.

Need to use SmsService in a test environment? Easy.

Conclusion: DIP is how you future-proof your software
DIP turns rigid, fragile systems into composable, adaptable solutions.

It’s how you stop rewriting business rules just to change a detail.
It’s how you separate what your code does from how it gets done.

"Details change. Behavior should not."


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 
Вверх Снизу