Рубрики
Без рубрики

Понимание Внедрения Зависимостей

Посмотрите Мое Видео-Объяснение Основная идея Внедрения зависимостей – одна из таких программ… Помеченный как ооп, угловой, java, spring.

Основная Идея

Внедрение зависимостей – одна из тех концепций программирования, которые довольно просты, но кажутся такими сложными, когда вы впервые сталкиваетесь с ними. Часто эта путаница является скорее признаком того, что вы еще недостаточно знакомы с базовым объектно-ориентированным программированием и тому подобным. Но вот основная идея:

  • Когда вы создаете объект, у него есть только те свойства и методы, которые ему всегда нужны, ничего лишнего

  • Объект имеет встроенный механизм, с помощью которого его можно расширять при необходимости. Эти новые функции являются “зависимостями”, которые необходимо “внедрить”, поскольку использование этих функций зависит от их внедрения.

Пример

Давайте представим, что мы создаем наш собственный веб-фреймворк, основная вещь, которую должен делать каждый фреймворк, – это запустить новый сервер, который прослушивает HTTP-порт. Итак, представьте себе следующее.

// Web Server Class

class WebServer {

  //Constructor takes one argument, an object with several properties including port
  constructor(config = {port: 3000}) {
    this.port = config.port;
  }

  //function to theoretically kickoff server listener
  listen() {
    console.log(`listening on port ${this.port}`);
  }
}

// Create New Instance of Web Server
const app = new WebServer({port: 4000});

// Server Starts Listening
app.listen()

обратите внимание, что нет никакой реальной функциональности, просто журналы, символизирующие, где функциональность было бы

Теперь прямо сейчас все, что может делать этот объект, – это слушать, у нас нет возможности объявлять маршруты, подключаться к базам данных или делать что-либо из того, что мы ожидаем, что веб-фреймворк позволит нам делать, и у нас нет способа внедрить эти функции единообразно.

* Преимущество встроенного механизма внедрения зависимостей заключается в том, что все сторонние библиотеки могут вести себя одинаково предсказуемым образом, что облегчает разработчику добавление и вычитание частей из проекта в проект

Механизм

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

class WebServer {
  constructor(
    config = {
      port: 3000,
      deps: [],
    }
  ) {
    this.port = config.port;
    // loops over each dependency and passes the instance to the function so it can add any methods or properties for that features set
    config.deps.forEach((dep) => {
      dep(this);
    });
  }

  listen() {
    console.log(`listening on port ${this.port}`);
  }
}

Итак, теперь предположим, что сторонние библиотеки определили следующие зависимости:

// Mock injection of routing function
const routeInject = (server) => {
    server.get = () => console.log('this is a get route')
    server.put = () => console.log('this is a put route')
    server.post = () => console.log('this is a post route')
    server.delete = () => console.log('this is a delete route')
}

// Mock injection of postgres database functions
const pgInject = (server) => {
    server.pgConnect = () => console.log('connected to db')
    server.query = () => console.log('query database')
}

Поэтому теперь, когда я создаю свой сервер, я могу вводить их через массив зависимостей в объекте конфигурации.

const app = new WebServer({
  port: 4000,
  // I add any injection functions in the deps array, they get to run in the constructor adding the methods to the instance of the web server
  deps: [routeInject, pgInject]
});

// Using the methods granted from the injection of postgres features
app.pgConnect()
app.query()

// Using the methods granted from the injection of router features
app.get()
app.post()

// The original listen methods all instances of WebServer have
app.listen();

В этом шаблоне я могу добавить столько зависимостей, сколько захочу. Преимущество в том, что мне не нужно иметь неиспользуемые методы и свойства в моем объекте, который мне не нужен. Это экономит память, позволяя моему коду быть более производительным и декларативным (поскольку я объявляю свои зависимости, гораздо проще оглянуться на свой код и узнать, что я использую).

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

Оригинал: “https://dev.to/alexmercedcoder/understanding-dependency-injection-3554”