Инверсия зависимостей - последний из принципов SOLID, представленных Бобом Мартином.

В своем первоначальном описании он изложил два принципа 👨🏽‍🏫:

A. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.

Б. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Эти два принципа предписывают использование абстракций, в основном «интерфейсов», чтобы гарантировать слабую связь между различными уровнями модулей в объектно-ориентированном программировании.

Например, простое приложение для управления клиентами в ядре ASP.NET обычно имеет репозиторий или уровень доступа к данным, где размещаются конкретные реализации того, как сохраняется база данных.

В этом случае принцип инверсии зависимостей ожидает, что конкретная реализация, которая читает или записывает на устройство ввода-вывода, не должна выполняться в вашем контроллере.

Давайте забегаем вперед, чтобы применить это в коде. 👨🏽‍💻👨🏽‍💻👨🏽‍💻👨🏽‍💻👨🏽‍💻👨🏽‍💻

Для этого сценария мы применим инверсию зависимостей самым простым способом:

👍Принцип A - модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.

я. Создайте интерфейс, определяющий методы, которые вы хотите реализовать.

II. Определите подпись (тип возвращаемого значения и параметр) ваших методов здесь. См. Подпись жирным шрифтом.

public interface ICustomerRepository
{
    List<Customer> GetAllCustomers();
    Customer GetCustomer(int id);
}

👍Принцип B - Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Реализуйте методы в модуле / классе нижнего уровня с учетом вашего интерфейса. Вы должны использовать подписи (тип возвращаемого значения и параметр), указанные в вашем интерфейсе, чтобы следовать Принципу B

public class CustomerRepository()
{
    public List<Customer> GetAllCustomers()
  {
     //implementation to retrieve customers from I/O: file, db e.t.c
  }
    public Customer GetCustomer(int id)
  {
    //implementation to retrieve customer from I/O: file, db…  e.t.c
  }
}

Просто применить? 👏😀

Мы успешно применили инверсию зависимостей очень простым, но эффективным способом и можем приступить к предоставлению объектов (зависимостей) классу посредством шаблона проектирования внедрения зависимостей , как описано в моем предыдущая статья: https://medium.com/@osewa.dare/hello-dependency-injection-c2b5fb3dd2a8.