Введение

Техника программного программирования

В разработке программного обеспечения инверсия управления (IoC) — это принцип проектирования, при котором пользовательские части компьютерной программы получают поток управления от обобщенного фреймворка. Термин «инверсия» имеет исторический характер: архитектура программного обеспечения с такой конструкцией «инвертирует» управление по сравнению с процедурным программированием. В процедурном программировании пользовательский код программы вызывает повторно используемые библиотеки для выполнения общих задач, но при инверсии управления фреймворк вызывает пользовательский код. Инверсия управления широко используется в фреймворках разработки приложений с момента появления сред графического пользовательского интерфейса и продолжает использоваться как в средах графического пользовательского интерфейса, так и во фреймворках веб-серверов. Инверсия управления делает фреймворк расширяемым благодаря методам, определяемым программистом приложения. Событийно-ориентированное программирование часто реализуется с использованием IoC, так что пользовательский код должен заботиться только об обработке событий, в то время как цикл событий и диспетчеризация событий/сообщений обрабатываются фреймворком или средой выполнения. Во фреймворках приложений веб-серверов диспетчеризация обычно называется маршрутизацией, а обработчики могут называться конечными точками. Фраза «инверсия управления» также стала использоваться в сообществе программистов Java для обозначения конкретных шаблонов внедрения зависимостей объектов, которые возникают с «IoC-контейнерами» в Java-фреймворках, таких как Spring Framework. В этом другом смысле «инверсия управления» относится к предоставлению фреймворку контроля над реализациями зависимостей, используемых объектами приложения. Таким образом, библиотека возвращает выбранный вариант в качестве значения вызова функции, а основная функция использует это значение для выполнения соответствующей команды. Такой подход был распространен в текстовых интерфейсах. Например, почтовый клиент может отображать экран с командами для загрузки новой почты, ответа на текущую почту, создания новой почты и т. д., и выполнение программы блокируется до тех пор, пока пользователь не нажмет клавишу для выбора команды. При инверсии управления, с другой стороны, программа будет написана с использованием программного фреймворка, который знает общие поведенческие и графические элементы, такие как оконные системы, меню, управление мышью и т. д. Пользовательский код «заполняет пробелы» для фреймворка, например, предоставляет таблицу элементов меню и регистрирует подпрограмму кода для каждого элемента, но именно фреймворк отслеживает действия пользователя и вызывает подпрограмму при выборе элемента меню. В примере почтового клиента фреймворк может отслеживать ввод с клавиатуры и мыши и вызывать команду, вызванную пользователем любым способом, а также одновременно отслеживать сетевой интерфейс, чтобы узнать, поступают ли новые сообщения, и обновлять экран при обнаружении сетевой активности. Тот же фреймворк можно использовать в качестве основы для программы электронной таблицы или текстового редактора. И наоборот, фреймворк ничего не знает о веб-браузерах, электронных таблицах или текстовых редакторах; реализация их функциональности требует пользовательского кода. Инверсия управления подразумевает, что повторно используемый код и код, специфичный для решаемой задачи, разрабатываются независимо друг от друга, хотя они работают вместе в приложении. Обратные вызовы, планировщики, циклы событий и шаблон шаблона — примеры шаблонов проектирования, которые следуют принципу инверсии управления, хотя этот термин чаще всего используется в контексте объектно-ориентированного программирования. (Внедрение зависимостей является примером отдельной, специфической идеи «инвертирования контроля над реализациями зависимостей», популяризированной Java-фреймворками.) но она тесно связана с концепцией инверсии программы, описанной Майклом Джексоном в его методологии структурированного программирования Джексона в 1970-х годах. Парсер снизу вверх можно рассматривать как инверсию парсера сверху вниз: в одном случае управление находится у парсера, а в другом — у принимающего приложения. Термин был использован Майклом Маттссоном в диссертации (с его первоначальным значением фреймворка, вызывающего код приложения, а не наоборот) и затем был взят оттуда Стефано Маццокки и популяризирован им в 1999 году в недействующем проекте Apache Software Foundation Avalon, в котором речь шла о родительском объекте, передающем зависимости дочернего объекта в дополнение к управлению потоком выполнения. Фраза была дополнительно популяризирована в 2004 году Робертом К. Мартином и Мартином Фаулером, последний из которых прослеживает происхождение термина к 1980-м годам. Шаблон метода шаблона ASP.NET Core

Рамки веб-приложений

Это пример кода для веб-приложения ASP.NET Core, который создает хост веб-приложения, регистрирует конечную точку и затем передает управление фреймворку:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();