День шестьсот сорок второй. #BestPractices #IDEALS
Принципы Разработки Микросервисов: IDEALS вместо SOLID. 7/7
S - Единственная ответственность (Single Responsibility)
Исходный принцип единственной ответственности (SRP) - это согласованная функциональность в объектно-ориентированном классе. Наличие нескольких обязанностей в классе, естественно, влечёт тесную связанность и приводит к хрупким проектам, которые трудно развивать и которые могут неожиданно сломаться при внесении изменений. Идея проста, но, как заметил дядя Боб, SRP очень легко понять, но трудно правильно реализовать.
Понятие единственной ответственности может быть распространено на связанность сервисов. Архитектура микросервисов предполагает, что блок развёртывания должен содержать только один сервис или несколько связанных сервисов. Если микросервис наполнен обязанностями, то есть содержит слишком много не совсем связанных между собой сервисов, он может страдать от проблем монолита. Раздутый микросервис становится всё труднее развивать с точки зрения функциональности и технологического стека. Кроме того, непрерывная доставка становится обременительной, поскольку многие разработчики работают над несколькими меняющимися частями, входящими в одну единицу развёртывания.
С другой стороны, если микросервисы слишком специфичны, более вероятно, что многим из них потребуется взаимодействовать для выполнения запроса пользователя. В худшем случае изменения данных могут быть распределены по разным микросервисам, что может создать сценарий распределённой транзакции.
Правильный размер микросервисов
Важным аспектом зрелости в дизайне микросервисов является способность создавать микросервисы, которые не являются слишком большими или слишком мелкими. Выход здесь не в каком-либо инструменте или технологии, а скорее в правильном моделировании предметной области. Моделирование серверных сервисов и определение границ микросервисов для них можно выполнить разными способами. Подход, который стал популярным в отрасли для определения размера микросервисов, заключается в следовании принципам Предметно-Ориентированной Разработки (DDD):
1. Сервис (например, REST) может иметь размер агрегата DDD.
2. Микросервис может иметь размер ограниченного контекста DDD. Сервисы в этом микросервисе будут соответствовать агрегатам в этом ограниченном контексте.
3. Для взаимодействия между микросервисами мы можем использовать:
- события домена, когда асинхронный обмен сообщениями соответствует требованиям;
- вызовы API с использованием некоторой формы уровня защиты от повреждений, когда более подходит формат запрос-ответ;
- репликацию данных с поддержкой согласованности, когда микросервису требуется значительный объём данных из других доступных ограниченных контекстов.
Источник: https://www.infoq.com/articles/microservices-design-ideals/
Принципы Разработки Микросервисов: IDEALS вместо SOLID. 7/7
S - Единственная ответственность (Single Responsibility)
Исходный принцип единственной ответственности (SRP) - это согласованная функциональность в объектно-ориентированном классе. Наличие нескольких обязанностей в классе, естественно, влечёт тесную связанность и приводит к хрупким проектам, которые трудно развивать и которые могут неожиданно сломаться при внесении изменений. Идея проста, но, как заметил дядя Боб, SRP очень легко понять, но трудно правильно реализовать.
Понятие единственной ответственности может быть распространено на связанность сервисов. Архитектура микросервисов предполагает, что блок развёртывания должен содержать только один сервис или несколько связанных сервисов. Если микросервис наполнен обязанностями, то есть содержит слишком много не совсем связанных между собой сервисов, он может страдать от проблем монолита. Раздутый микросервис становится всё труднее развивать с точки зрения функциональности и технологического стека. Кроме того, непрерывная доставка становится обременительной, поскольку многие разработчики работают над несколькими меняющимися частями, входящими в одну единицу развёртывания.
С другой стороны, если микросервисы слишком специфичны, более вероятно, что многим из них потребуется взаимодействовать для выполнения запроса пользователя. В худшем случае изменения данных могут быть распределены по разным микросервисам, что может создать сценарий распределённой транзакции.
Правильный размер микросервисов
Важным аспектом зрелости в дизайне микросервисов является способность создавать микросервисы, которые не являются слишком большими или слишком мелкими. Выход здесь не в каком-либо инструменте или технологии, а скорее в правильном моделировании предметной области. Моделирование серверных сервисов и определение границ микросервисов для них можно выполнить разными способами. Подход, который стал популярным в отрасли для определения размера микросервисов, заключается в следовании принципам Предметно-Ориентированной Разработки (DDD):
1. Сервис (например, REST) может иметь размер агрегата DDD.
2. Микросервис может иметь размер ограниченного контекста DDD. Сервисы в этом микросервисе будут соответствовать агрегатам в этом ограниченном контексте.
3. Для взаимодействия между микросервисами мы можем использовать:
- события домена, когда асинхронный обмен сообщениями соответствует требованиям;
- вызовы API с использованием некоторой формы уровня защиты от повреждений, когда более подходит формат запрос-ответ;
- репликацию данных с поддержкой согласованности, когда микросервису требуется значительный объём данных из других доступных ограниченных контекстов.
Источник: https://www.infoq.com/articles/microservices-design-ideals/
День шестьсот сорок третий. #Оффтоп #97Вещей
97 Вещей, Которые Должен Знать Каждый Программист
65. Именование - это легко. Абстракция намного сложнее.
Один из наиболее распространённых мифов в разработке ПО, что именование - это сложно. Это резюмируется шутливом высказывании, приписываемом Филу Карлтону: «В программировании есть только две сложные вещи: недействительность кеша и именование объектов».
На самом деле именование не должно быть сложным. Именование - это производная от качества ваших абстракций. Если у вас есть чёткое определение обязанностей и разделение ответственности, имена обычно получаются естественным образом. В этом смысле именование - лакмусовая бумажка. Если вы ломаете голову над тем, как назвать что-то, то нужно исправлять ваши базовые абстракции.
Время, потраченное на попытки дать имя неочевидным вещам, - потерянное время.
Распространённые "запахи" именования
Есть ряд "запахов", которые могут закрасться в имена. Разработчики обычно не лингвисты, поэтому проблема чаще всего в плохом дизайне. Например, длинные имена означают, что у объекта слишком много обязанностей. Чрезмерное комментирование может быть признаком того, что название недостаточно ясно, чтобы говорить само за себя.
Нечёткие абстракции часто приводят к использованию неоднозначных существительных. Часто в монолитных приложениях Java или .Net код переплетён между неясными слоями, и возникают прекрасные
Переменные чаще всего страдают от плохого именования. Легко найти бессмысленные имена, которым не хватает точности. Десятки миллионов экземпляров «foo» на GitHub показывают, как часто разработчики поддаются соблазну не думать над именем.
Вы должны обеспечить прямую связь между именем и тем, что делает элемент. Если при чтении имя приходится «расшифровывать», имя не выполняет свою работу. Вы создали препятствие, усложняющее понимание контекста.
Постоянно контролировать имена может быть сложно. Обязанности со временем развиваются, появляются новые функции, и вы можете обнаружить, что имя больше не отражает реальность. Такой дрейф именования является самым настоящим техническим долгом, поскольку показывает, что дизайн системы не соответствовал нашему пониманию требований.
Особенно опасно использовать сокращения. Они сокращают код, но затрудняют чтение и могут быть неудобными для произношения. Что ещё более важно, постороннему человеку или новичку понадобится словарь для понимания концепций.
Следите за своим языком
Эрик Эван использовал термин ubiquitous («повсеместный») для описания общего языка, которым могут пользоваться и разработчики, и пользователи. Это было описано в контексте Предметно-Ориентированного Проектирования, при котором управление сложностью происходит путём разделения домена на автономные «ограниченные контексты», каждый со своим собственным, внутренним языком.
Это означает, что вы не можете найти единый язык для однозначного описания всей предметной области. Разделение области на части позволяет создавать более чёткие абстракции и, следовательно, более значимые имена для объектов.
Немного иронично, что термин, предназначенный для внесения ясности, нуждается в объяснении, но идея очень ценная. Создание универсального языка должно быть постоянной совместной работой в чётко определенной области. Имена должны быть обоснованы терминами, которые всем понятны. Вы должны уметь составить простой словарь, который можно будет интегрировать в повседневный ритм разработки.
Источник: https://www.ben-morris.com/naming-things-is-easy-abstraction-is-much-harder/
97 Вещей, Которые Должен Знать Каждый Программист
65. Именование - это легко. Абстракция намного сложнее.
Один из наиболее распространённых мифов в разработке ПО, что именование - это сложно. Это резюмируется шутливом высказывании, приписываемом Филу Карлтону: «В программировании есть только две сложные вещи: недействительность кеша и именование объектов».
На самом деле именование не должно быть сложным. Именование - это производная от качества ваших абстракций. Если у вас есть чёткое определение обязанностей и разделение ответственности, имена обычно получаются естественным образом. В этом смысле именование - лакмусовая бумажка. Если вы ломаете голову над тем, как назвать что-то, то нужно исправлять ваши базовые абстракции.
Время, потраченное на попытки дать имя неочевидным вещам, - потерянное время.
Распространённые "запахи" именования
Есть ряд "запахов", которые могут закрасться в имена. Разработчики обычно не лингвисты, поэтому проблема чаще всего в плохом дизайне. Например, длинные имена означают, что у объекта слишком много обязанностей. Чрезмерное комментирование может быть признаком того, что название недостаточно ясно, чтобы говорить само за себя.
Нечёткие абстракции часто приводят к использованию неоднозначных существительных. Часто в монолитных приложениях Java или .Net код переплетён между неясными слоями, и возникают прекрасные
SomethingManager
или SomethingHelper
. Обычно это свалки слабо связанной логики, поощряющие плохое планирование обязанностей.Переменные чаще всего страдают от плохого именования. Легко найти бессмысленные имена, которым не хватает точности. Десятки миллионов экземпляров «foo» на GitHub показывают, как часто разработчики поддаются соблазну не думать над именем.
Вы должны обеспечить прямую связь между именем и тем, что делает элемент. Если при чтении имя приходится «расшифровывать», имя не выполняет свою работу. Вы создали препятствие, усложняющее понимание контекста.
Постоянно контролировать имена может быть сложно. Обязанности со временем развиваются, появляются новые функции, и вы можете обнаружить, что имя больше не отражает реальность. Такой дрейф именования является самым настоящим техническим долгом, поскольку показывает, что дизайн системы не соответствовал нашему пониманию требований.
Особенно опасно использовать сокращения. Они сокращают код, но затрудняют чтение и могут быть неудобными для произношения. Что ещё более важно, постороннему человеку или новичку понадобится словарь для понимания концепций.
Следите за своим языком
Эрик Эван использовал термин ubiquitous («повсеместный») для описания общего языка, которым могут пользоваться и разработчики, и пользователи. Это было описано в контексте Предметно-Ориентированного Проектирования, при котором управление сложностью происходит путём разделения домена на автономные «ограниченные контексты», каждый со своим собственным, внутренним языком.
Это означает, что вы не можете найти единый язык для однозначного описания всей предметной области. Разделение области на части позволяет создавать более чёткие абстракции и, следовательно, более значимые имена для объектов.
Немного иронично, что термин, предназначенный для внесения ясности, нуждается в объяснении, но идея очень ценная. Создание универсального языка должно быть постоянной совместной работой в чётко определенной области. Имена должны быть обоснованы терминами, которые всем понятны. Вы должны уметь составить простой словарь, который можно будет интегрировать в повседневный ритм разработки.
Источник: https://www.ben-morris.com/naming-things-is-easy-abstraction-is-much-harder/
День шестьсот сорок четвёртый. #ЧтоНовенького #CSharp9
C# 9 Неизвестные Фишки
В C# 9 появилось много новых возможностей (см. посты по тегу #CSharp9) и несколько очень полезных малоизвестных вещей.
Инициализаторы модулей
Этот серьёзный недостаток, который до сих пор можно было исправить только некоторыми сторонними инструментами, теперь поддерживается в .NET. Инициализаторы модулей позволят библиотекам выполнять инициализацию при загрузке с минимальными накладными расходами и без необходимости явного вызова со стороны пользовательского кода. В основном это встречалось в библиотеках тестов, где вы хотите что-то инициализировать перед запуском одного, нескольких или даже всех тестов в сборке. Например, его можно использовать для переопределения некоторых статических переменных перед запуском тестирования. Чтобы использовать эту функцию, пометьте метод атрибутом
- быть статическим
- без параметров
- возвращать void
- не быть обобщённым
- не содержаться в обобщённом классе
- быть доступным из содержащего его модуля (
Для реализации проверок на null требуется много шаблонного кода и хорошая дисциплина для их последовательного применения. C# 9 решает эту проблему, предоставляя упрощённый синтаксис. Просто добавьте
Ковариантные переопределения теперь позволяют объявлять более конкретный тип при переопределении метода базового класса, содержащего менее конкретный тип возврата:
Это новая конструкция, которая позволяет объявлять
Такая возможность уже существовала с
Источник: https://blog.miguelbernard.com/c-9-the-unknown-goodies/
C# 9 Неизвестные Фишки
В C# 9 появилось много новых возможностей (см. посты по тегу #CSharp9) и несколько очень полезных малоизвестных вещей.
Инициализаторы модулей
Этот серьёзный недостаток, который до сих пор можно было исправить только некоторыми сторонними инструментами, теперь поддерживается в .NET. Инициализаторы модулей позволят библиотекам выполнять инициализацию при загрузке с минимальными накладными расходами и без необходимости явного вызова со стороны пользовательского кода. В основном это встречалось в библиотеках тестов, где вы хотите что-то инициализировать перед запуском одного, нескольких или даже всех тестов в сборке. Например, его можно использовать для переопределения некоторых статических переменных перед запуском тестирования. Чтобы использовать эту функцию, пометьте метод атрибутом
ModuleInitializer
. Не все методы могут поддерживать эту функцию. Метод должен:- быть статическим
- без параметров
- возвращать void
- не быть обобщённым
- не содержаться в обобщённом классе
- быть доступным из содержащего его модуля (
internal
или public
).[ModuleInitializer]Упрощенная проверка на null
public static void Magic() { … }
Для реализации проверок на null требуется много шаблонного кода и хорошая дисциплина для их последовательного применения. C# 9 решает эту проблему, предоставляя упрощённый синтаксис. Просто добавьте
!
в конце имени параметра метода:public void Before(string name) {Следующий метод приведёт к аналогичному сгенерированному IL-коду:
if (name is null)
throw new ArgumentNullException();
}
public void Now(string name!) { }Ковариантные Переопределения
Ковариантные переопределения теперь позволяют объявлять более конкретный тип при переопределении метода базового класса, содержащего менее конкретный тип возврата:
abstract class Animal {Это значительное улучшение, поскольку теперь вы можете избежать приведения возвращаемого значения во время выполнения при использовании дочернего типа:
public abstract Food GetFood();
}
class Tiger : Animal {
public override Meat GetFood() => …;
}
var t = new Tiger();Int Нативного Размера
// Раньше
Meat m = (Meat)t.GetFood();
// Сейчас
Meat m2 = t.GetFood();
Это новая конструкция, которая позволяет объявлять
int
, размер которого определяется платформой: 32 или 64 бита. nint
и nuint
- новые ключевые слова для этого.Такая возможность уже существовала с
IntPtr
и UIntPtr
. nint
и nuint
- это просто оболочки над этими типами, предоставляющие дополнительные возможности, такие как преобразование и арифметические операции, которые невозможны с IntPtr
. Это может значительно оптимизировать производительность приложения при выполнении интенсивных вычислений, требующих низкоуровневого доступа и где важен каждый байт.Источник: https://blog.miguelbernard.com/c-9-the-unknown-goodies/
День шестьсот сорок пятый.
Сертификат Microsoft. Экзамен 70-486
Мммда… Не могу сказать «к этому меня жизнь не готовила», но что стало неожиданностью – это точно. Очень много вопросов по легаси (Framework и даже WCF). Я всё-таки готовился к подавляющему большинству вопросов про Core, поэтому, когда один за другим шли вопросы с примерами кода из Framework и по настройкам в web.config, как-то даже взгрустнулось, потому что при подготовке по темам больше внимания уделял тому, как это реализовано сейчас. Возможно, поэтому хоть и сдал, но набрал не столько баллов, на сколько, как я думаю, был готов (да, завышенное ЧСВ 😊).
Ну и, возможно, поэтому эти экзамены и сертификаты Майкрософт убирает (31 января 2021). Их прям сильно надо обновлять, наверное, проще сделать новый (надеюсь, он появится).
Про ход экзамена уже писал, когда сдавал предыдущий. Ничего не изменилось.
Если кто ещё хочет успеть сдать, список тем по ссылке выше. Упор сделайте на книжку для подготовки.
Сертификат Microsoft. Экзамен 70-486
Мммда… Не могу сказать «к этому меня жизнь не готовила», но что стало неожиданностью – это точно. Очень много вопросов по легаси (Framework и даже WCF). Я всё-таки готовился к подавляющему большинству вопросов про Core, поэтому, когда один за другим шли вопросы с примерами кода из Framework и по настройкам в web.config, как-то даже взгрустнулось, потому что при подготовке по темам больше внимания уделял тому, как это реализовано сейчас. Возможно, поэтому хоть и сдал, но набрал не столько баллов, на сколько, как я думаю, был готов (да, завышенное ЧСВ 😊).
Ну и, возможно, поэтому эти экзамены и сертификаты Майкрософт убирает (31 января 2021). Их прям сильно надо обновлять, наверное, проще сделать новый (надеюсь, он появится).
Про ход экзамена уже писал, когда сдавал предыдущий. Ничего не изменилось.
Если кто ещё хочет успеть сдать, список тем по ссылке выше. Упор сделайте на книжку для подготовки.
👍1
День шестьсот сорок шестой. #ЧтоНовенького
.NET 5.0 запускается на .NET Conf 10-12 ноября
.NET Conf - это бесплатное трехдневное виртуальное мероприятие для разработчиков, организованное совместно сообществом .NET и Microsoft. В этом году .NET 5.0 будет запущен на .NET Conf 2020.
В течение этих трех дней будет проводиться множество сессий с участием докладчиков из сообщества и команд .NET. Присоединяйтесь к беседе и задавайте вопросы, используя хэштег: #dotNETConf в Twitter.
На конференции планируется более 80 прямых трансляций на www.dotnetconf.net, Microsoft Learn TV, YouTube канале .NET и канале Visual Studio Twitch.
Конференция начнётся 10 ноября в 8:00 по тихоокеанскому времени (19:00 по Москве) со вступительного слова от директор по управлению программами Microsoft Скотта Хантера.
Кроме того, можно посетить местные виртуальные мероприятия в вашем часовом поясе и на вашем языке.
Источник: https://devblogs.microsoft.com/dotnet/net-5-0-launches-at-net-conf-november-10-12/
.NET 5.0 запускается на .NET Conf 10-12 ноября
.NET Conf - это бесплатное трехдневное виртуальное мероприятие для разработчиков, организованное совместно сообществом .NET и Microsoft. В этом году .NET 5.0 будет запущен на .NET Conf 2020.
В течение этих трех дней будет проводиться множество сессий с участием докладчиков из сообщества и команд .NET. Присоединяйтесь к беседе и задавайте вопросы, используя хэштег: #dotNETConf в Twitter.
На конференции планируется более 80 прямых трансляций на www.dotnetconf.net, Microsoft Learn TV, YouTube канале .NET и канале Visual Studio Twitch.
Конференция начнётся 10 ноября в 8:00 по тихоокеанскому времени (19:00 по Москве) со вступительного слова от директор по управлению программами Microsoft Скотта Хантера.
Кроме того, можно посетить местные виртуальные мероприятия в вашем часовом поясе и на вашем языке.
Источник: https://devblogs.microsoft.com/dotnet/net-5-0-launches-at-net-conf-november-10-12/
День шестьсот сорок седьмой. #Юмор
Сегодня хотел выложить, наверное, самые известные из «Хроник» 2000х – «Дневник тестировщика». Но повесть не влезает даже в телеграф, поэтому вот вам ссыль на старый ламповый сайт самиздата, даже от дизайна которого сводит олдскулы.
https://samlib.ru/b/brigadir_j_a/test.shtml
Ностальгируйте, наслаждайтесь)))
Сегодня хотел выложить, наверное, самые известные из «Хроник» 2000х – «Дневник тестировщика». Но повесть не влезает даже в телеграф, поэтому вот вам ссыль на старый ламповый сайт самиздата, даже от дизайна которого сводит олдскулы.
https://samlib.ru/b/brigadir_j_a/test.shtml
Ностальгируйте, наслаждайтесь)))
День шестьсот сорок восьмой. #TipsAndTricks
Советы по работе с Windows Terminal
Windows Terminal имеет множество функций для настройки под ваши нужды.
Первый запуск
Терминал по умолчанию поставляется с профилями Windows PowerShell, командной строки и Azure Cloud Shell. Если у вас установлен какой-либо дистрибутив Windows для Linux (WSL), терминал автоматически создаст профиль для него.
Настройка
Терминал поставляется с большим набором настроек по умолчанию, включая цветовые схемы и сочетания клавиш. Если вы хотите просмотреть файл настроек по умолчанию, нажмите кнопку «Настройки» в раскрывающемся меню, удерживая Alt.
Настроить можно как отдельные профили, так и применить глобальные настройки для всех профилей, добавив параметр в массив
Цветовые схемы
Терминал по умолчанию поставляется с набором цветовых схем. Новые можно найти на terminalplash.com. Также можно подобрать цветовую схему к фоновому изображению, используя палитру PowerToys.
Oh my Posh и Terminal-Icons позволяют настроить внешний вид строки приглашения с помощью цветов, глифов и смайликов.
wt.exe с аргументами
Вы можете запустить терминал в определенной конфигурации с помощью команды wt.exe и аргументов командной строки. Например, можно передать вид расположения вкладок и панелей, а также их начальные каталоги и профили. Можно сохранить эту команду как ярлык, чтобы открывать терминал в нужной конфигурации. А если выполнить её внутри терминала, она изменит текущее окно.
Панели
Терминал поддерживает несколько панелей. Вы можете открыть новую панель, удерживая Alt и щёлкнув на один из профилей в раскрывающемся списке, или используя сочетание клавиш: Alt+Shift+D. Перемещать фокус по панелям можно стрелками, удерживая Alt. А изменить размер панелей также стрелками, удерживая Alt+Shift.
Копирование и вставка
В Терминале по умолчанию для копирования и вставки используются сочетания клавиш Ctrl+C и Ctrl+V. Если ничего не выделено, Ctrl+C будет действовать как обычно, как команда прерывания текущей операции.
Команды по горячим клавишам
Терминал даёт возможность вставлять команды по горячим клавишам. Это можно сделать, добавив строку в массив
Например, очистка экрана:
Источник: https://devblogs.microsoft.com/commandline/windows-terminal-tips-and-tricks/
Советы по работе с Windows Terminal
Windows Terminal имеет множество функций для настройки под ваши нужды.
Первый запуск
Терминал по умолчанию поставляется с профилями Windows PowerShell, командной строки и Azure Cloud Shell. Если у вас установлен какой-либо дистрибутив Windows для Linux (WSL), терминал автоматически создаст профиль для него.
Настройка
Терминал поставляется с большим набором настроек по умолчанию, включая цветовые схемы и сочетания клавиш. Если вы хотите просмотреть файл настроек по умолчанию, нажмите кнопку «Настройки» в раскрывающемся меню, удерживая Alt.
Настроить можно как отдельные профили, так и применить глобальные настройки для всех профилей, добавив параметр в массив
defaults
внутри объекта profiles
в файле настроек. Список всех возможных настроек профиля можно найти на странице настроек профиля в документации.Цветовые схемы
Терминал по умолчанию поставляется с набором цветовых схем. Новые можно найти на terminalplash.com. Также можно подобрать цветовую схему к фоновому изображению, используя палитру PowerToys.
Oh my Posh и Terminal-Icons позволяют настроить внешний вид строки приглашения с помощью цветов, глифов и смайликов.
wt.exe с аргументами
Вы можете запустить терминал в определенной конфигурации с помощью команды wt.exe и аргументов командной строки. Например, можно передать вид расположения вкладок и панелей, а также их начальные каталоги и профили. Можно сохранить эту команду как ярлык, чтобы открывать терминал в нужной конфигурации. А если выполнить её внутри терминала, она изменит текущее окно.
Панели
Терминал поддерживает несколько панелей. Вы можете открыть новую панель, удерживая Alt и щёлкнув на один из профилей в раскрывающемся списке, или используя сочетание клавиш: Alt+Shift+D. Перемещать фокус по панелям можно стрелками, удерживая Alt. А изменить размер панелей также стрелками, удерживая Alt+Shift.
Копирование и вставка
В Терминале по умолчанию для копирования и вставки используются сочетания клавиш Ctrl+C и Ctrl+V. Если ничего не выделено, Ctrl+C будет действовать как обычно, как команда прерывания текущей операции.
Команды по горячим клавишам
Терминал даёт возможность вставлять команды по горячим клавишам. Это можно сделать, добавив строку в массив
actions
файла настроек:Например, очистка экрана:
{"command":{"action":"sendInput",Переход к родительскому каталогу:
"input": "clear\r"},
"keys": "alt+k"}
{"command": {"action": "sendInput",Также можно использовать эту функцию для запуска сборок или тестовых скриптов.
"input": "cd..\r"},
"keys": "ctrl+up"}
Источник: https://devblogs.microsoft.com/commandline/windows-terminal-tips-and-tricks/
День шестьсот сорок девятый. #ЗаметкиНаПолях
Жизненный цикл запроса в ASP.NET Core MVC 3. Начало
Жизненный цикл запроса – это серия компонентов, событий или этапов приложения, которые обрабатывают запрос или отвечают на действие пользователя.
Жизненный цикл запроса в ASP.NET Core MVC представлен на рисунке ниже.
1. Промежуточное ПО (Middleware)
Приложения MVC в .NET Core построены на основе концепции промежуточного ПО. Компоненты промежуточного ПО образуют основные блоки HTTP-конвейера приложения. Они предоставляют такие функции, как возможность обслуживания статических файлов, авторизации пользователей, маршрутизации запросов и т.п.
2. Маршрутизация (Routing)
Модель MVC фактически реализуется с помощью промежуточного ПО маршрутизации. .NET Core 3 использует новую систему, называемую маршрутизацией конечных точек. Она выполняет две важные задачи:
- выбор конечной точки для обработки запроса,
- выполнение этой конечной точки.
В контексте MVC конечную точку можно рассматривать как метод действия контроллера. Таким образом выполнение конечной точки переводит запрос из промежуточного ПО в MVC.
3. Инициализация контроллера
Контроллер создаётся в фабрике контроллеров. Затем компонент, называемый инициатором действия контроллера, управляет выполнением метода действия, чтобы предоставить функции, с которыми мы знакомы в повседневной разработке, вроде привязки модели.
4. Выполнение метода действия
На этом этапе также вызываются фильтры действий и выполняется сам метод действия, который производит результат действия.
5. Выполнение результата действия
После того, как результат действия подготовлен, выполняется следующий этап - выполнение результата. MVC отделяет объявление результата от выполнения результата, чтобы обеспечить большую гибкость абстракции. Кроме того, на этом этапе выполняются фильтры результатов действия.
6. Отображение представления
Если результатом является тип представления, вызывается механизм представления, который отвечает за поиск и отображение представления (генерация ответа HTTP). В противном случае итогом выполнения результата действия является вывод результата в ответ HTTP напрямую.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
Жизненный цикл запроса в ASP.NET Core MVC 3. Начало
Жизненный цикл запроса – это серия компонентов, событий или этапов приложения, которые обрабатывают запрос или отвечают на действие пользователя.
Жизненный цикл запроса в ASP.NET Core MVC представлен на рисунке ниже.
1. Промежуточное ПО (Middleware)
Приложения MVC в .NET Core построены на основе концепции промежуточного ПО. Компоненты промежуточного ПО образуют основные блоки HTTP-конвейера приложения. Они предоставляют такие функции, как возможность обслуживания статических файлов, авторизации пользователей, маршрутизации запросов и т.п.
2. Маршрутизация (Routing)
Модель MVC фактически реализуется с помощью промежуточного ПО маршрутизации. .NET Core 3 использует новую систему, называемую маршрутизацией конечных точек. Она выполняет две важные задачи:
- выбор конечной точки для обработки запроса,
- выполнение этой конечной точки.
В контексте MVC конечную точку можно рассматривать как метод действия контроллера. Таким образом выполнение конечной точки переводит запрос из промежуточного ПО в MVC.
3. Инициализация контроллера
Контроллер создаётся в фабрике контроллеров. Затем компонент, называемый инициатором действия контроллера, управляет выполнением метода действия, чтобы предоставить функции, с которыми мы знакомы в повседневной разработке, вроде привязки модели.
4. Выполнение метода действия
На этом этапе также вызываются фильтры действий и выполняется сам метод действия, который производит результат действия.
5. Выполнение результата действия
После того, как результат действия подготовлен, выполняется следующий этап - выполнение результата. MVC отделяет объявление результата от выполнения результата, чтобы обеспечить большую гибкость абстракции. Кроме того, на этом этапе выполняются фильтры результатов действия.
6. Отображение представления
Если результатом является тип представления, вызывается механизм представления, который отвечает за поиск и отображение представления (генерация ответа HTTP). В противном случае итогом выполнения результата действия является вывод результата в ответ HTTP напрямую.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
День шестьсот пятидесятый. #ЗаметкиНаПолях
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО (Middleware)
Промежуточное ПО - это набор компонентов, которые образуют конвейер запросов уровня приложения. Эти компоненты отвечают за обработку входящих запросов и генерацию соответствующего ответа либо напрямую, либо с помощью инфраструктуры, такой как MVC. Промежуточное ПО обеспечивает все виды базовой инфраструктуры: маршрутизация, сессии, CORS, аутентификация, кеширование и т.п. Общие функции, которые применяются в различных приложениях, часто являются хорошими кандидатами для промежуточного ПО. Конвейер запросов .NET Core может иметь переменное количество компонентов промежуточного ПО.
Каждый модуль промежуточного ПО может воздействовать на запрос по мере его прохождения по конвейеру, а затем воздействовать снова при отправке сгенерированного ответа. Можно добавить сколько угодно компонентов промежуточного ПО, но важен порядок их регистрации.
Компоненты промежуточного ПО могут выбрать один из трёх методов обработки запроса:
1. Сгенерировать ответ (метод Run)
В этом случае конвейер запроса прерывается, ответ возвращается пользователю, а компоненты промежуточного ПО, зарегистрированные после текущего, не выполняются. Например, промежуточное ПО статических файлов возвращает содержимое файла сразу в ответ.
2. Воздействовать на запрос и передать его дальше (метод Use)
Промежуточное ПО выполняет некоторую работу (или не выполняет никакой) и передаёт запрос следующему зарегистрированному промежуточному ПО. Например, добавление записи о запросе в лог.
3. Перенаправить запрос (метод Map)
Это разновидность условного оператора в конвейере запросов. В зависимости запрошенного URL, может выполняться то или иное действие.
На картинке ниже представлена схема конвейера промежуточного ПО.
При старте приложения в классах Program.cs и Startup.cs происходит построение конвейера для обработки входящих запросов. Для примера предположим, у нас есть промежуточное ПО
- обслуживания статических файлов,
- маршрутизации,
- авторизации.
В .NET Core 3 маршрутизация разделена на два компонента:
- промежуточное ПО маршрутизации конечных точек (Endpoint Routing Middleware), которое решает, какая из зарегистрированных конечных точек должна обрабатывать запрос.
- промежуточное ПО конечных точек (Endpoint Middleware), которое выполняет конечную точку (передаёт запрос в среду MVC).
Между ними расположено промежуточное ПО авторизации, которое решает, должен ли пользователь быть авторизован для выполнения этой выбранной конечной точки. Если пользователь авторизован, запрос пересылается промежуточному ПО конечной точки.
MVC генерирует ответ определённого типа, например представление или JSON. Затем все компоненты промежуточного ПО могут, при желании, выполнить код в обратном порядке, когда ответ отправляется обратно в браузер, хотя большинство из них на этом этапе просто пропускают ответ дальше. Этот процесс выполняется для каждого запроса.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО (Middleware)
Промежуточное ПО - это набор компонентов, которые образуют конвейер запросов уровня приложения. Эти компоненты отвечают за обработку входящих запросов и генерацию соответствующего ответа либо напрямую, либо с помощью инфраструктуры, такой как MVC. Промежуточное ПО обеспечивает все виды базовой инфраструктуры: маршрутизация, сессии, CORS, аутентификация, кеширование и т.п. Общие функции, которые применяются в различных приложениях, часто являются хорошими кандидатами для промежуточного ПО. Конвейер запросов .NET Core может иметь переменное количество компонентов промежуточного ПО.
Каждый модуль промежуточного ПО может воздействовать на запрос по мере его прохождения по конвейеру, а затем воздействовать снова при отправке сгенерированного ответа. Можно добавить сколько угодно компонентов промежуточного ПО, но важен порядок их регистрации.
Компоненты промежуточного ПО могут выбрать один из трёх методов обработки запроса:
1. Сгенерировать ответ (метод Run)
В этом случае конвейер запроса прерывается, ответ возвращается пользователю, а компоненты промежуточного ПО, зарегистрированные после текущего, не выполняются. Например, промежуточное ПО статических файлов возвращает содержимое файла сразу в ответ.
2. Воздействовать на запрос и передать его дальше (метод Use)
Промежуточное ПО выполняет некоторую работу (или не выполняет никакой) и передаёт запрос следующему зарегистрированному промежуточному ПО. Например, добавление записи о запросе в лог.
3. Перенаправить запрос (метод Map)
Это разновидность условного оператора в конвейере запросов. В зависимости запрошенного URL, может выполняться то или иное действие.
На картинке ниже представлена схема конвейера промежуточного ПО.
При старте приложения в классах Program.cs и Startup.cs происходит построение конвейера для обработки входящих запросов. Для примера предположим, у нас есть промежуточное ПО
- обслуживания статических файлов,
- маршрутизации,
- авторизации.
В .NET Core 3 маршрутизация разделена на два компонента:
- промежуточное ПО маршрутизации конечных точек (Endpoint Routing Middleware), которое решает, какая из зарегистрированных конечных точек должна обрабатывать запрос.
- промежуточное ПО конечных точек (Endpoint Middleware), которое выполняет конечную точку (передаёт запрос в среду MVC).
Между ними расположено промежуточное ПО авторизации, которое решает, должен ли пользователь быть авторизован для выполнения этой выбранной конечной точки. Если пользователь авторизован, запрос пересылается промежуточному ПО конечной точки.
MVC генерирует ответ определённого типа, например представление или JSON. Затем все компоненты промежуточного ПО могут, при желании, выполнить код в обратном порядке, когда ответ отправляется обратно в браузер, хотя большинство из них на этом этапе просто пропускают ответ дальше. Этот процесс выполняется для каждого запроса.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
День шестьсот пятьдесят первый. #ЗаметкиНаПолях
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация (Routing)
Маршрутизация в ASP.NET Core MVC 3 - это процесс сопоставления входящих запросов с конечными точками.
В MVC доступны два вида маршрутизации:
- традиционная маршрутизация объявляется централизованно для всего приложения,
- маршрутизация на основе атрибутов применяется непосредственно к конкретному контроллеру или методу действия через атрибут. Подробнее тут
.NET Core 3 использует новую систему маршрутизации конечных точек, которая впервые появилась в .NET Core 2.2, и обеспечивает большую гибкость в обработке запросов. В более ранних версиях был компонент промежуточного ПО, называемый маршрутизатором (см. картинку ниже). Он передавал запрос и данные в компонент MVC, называемый обработчиком маршрута. Обработчик использовал эти данные, чтобы решить, какой метод действия контроллера должен обрабатывать запрос. Затем маршрутизатор выполнял выбранный метод действия.
Это приводило к нескольким проблемам:
1. Ни один из других компонентов промежуточного ПО не знал, какая конечная точка или метод действия будет обрабатывать запрос до того, как он будет обработан MVC. Это создавало трудности для компонентов промежуточного ПО, которые должны анализировать маршруты, например, компонентов авторизации.
2. Этот рабочий процесс также тесно связывал MVC с обязанностями по маршрутизации, вместо того, чтобы отвечать только за генерацию ответа.
Маршрутизация конечных точек устраняет обе эти проблемы, абстрагируя маршрутизацию от MVC (см. картинку ниже). В ней задействованы два компонента промежуточного ПО. Их названия могут немного сбивать с толку:
1. Промежуточное ПО маршрутизации конечных точек - решает, какая конечная точка, зарегистрированная в приложении, должна обрабатывать входящий запрос. Выбранная конечная точка затем назначается объекту запроса, чтобы следующее промежуточное ПО могло использовать её данные для принятия собственных решений.
2. Промежуточное ПО конечных точек - фактически выполняет выбранную конечную точку для генерации ответа позже в конвейере.
Конечные точки - это классы, содержащие имя конечной точки, паттерн пути, метаданные и делегат запроса, который представляет собой функцию, используемую для генерации ответа на входящий запрос. В контексте MVC делегат представляет собой оболочку вокруг метода, который создаёт экземпляр контроллера и выполняет выбранный метод действия. Конечные точки создаются при старте приложения классом, который называется источник данных конечных точек методов действия контроллеров (Controller Action Endpoint Data Source). Он обходит все контроллеры и составляет список всех возможных конечных точек. Также он хранит коллекцию зарегистрированных маршрутов и может сопоставлять маршруты с конечными точками.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация (Routing)
Маршрутизация в ASP.NET Core MVC 3 - это процесс сопоставления входящих запросов с конечными точками.
В MVC доступны два вида маршрутизации:
- традиционная маршрутизация объявляется централизованно для всего приложения,
- маршрутизация на основе атрибутов применяется непосредственно к конкретному контроллеру или методу действия через атрибут. Подробнее тут
.NET Core 3 использует новую систему маршрутизации конечных точек, которая впервые появилась в .NET Core 2.2, и обеспечивает большую гибкость в обработке запросов. В более ранних версиях был компонент промежуточного ПО, называемый маршрутизатором (см. картинку ниже). Он передавал запрос и данные в компонент MVC, называемый обработчиком маршрута. Обработчик использовал эти данные, чтобы решить, какой метод действия контроллера должен обрабатывать запрос. Затем маршрутизатор выполнял выбранный метод действия.
Это приводило к нескольким проблемам:
1. Ни один из других компонентов промежуточного ПО не знал, какая конечная точка или метод действия будет обрабатывать запрос до того, как он будет обработан MVC. Это создавало трудности для компонентов промежуточного ПО, которые должны анализировать маршруты, например, компонентов авторизации.
2. Этот рабочий процесс также тесно связывал MVC с обязанностями по маршрутизации, вместо того, чтобы отвечать только за генерацию ответа.
Маршрутизация конечных точек устраняет обе эти проблемы, абстрагируя маршрутизацию от MVC (см. картинку ниже). В ней задействованы два компонента промежуточного ПО. Их названия могут немного сбивать с толку:
1. Промежуточное ПО маршрутизации конечных точек - решает, какая конечная точка, зарегистрированная в приложении, должна обрабатывать входящий запрос. Выбранная конечная точка затем назначается объекту запроса, чтобы следующее промежуточное ПО могло использовать её данные для принятия собственных решений.
2. Промежуточное ПО конечных точек - фактически выполняет выбранную конечную точку для генерации ответа позже в конвейере.
Конечные точки - это классы, содержащие имя конечной точки, паттерн пути, метаданные и делегат запроса, который представляет собой функцию, используемую для генерации ответа на входящий запрос. В контексте MVC делегат представляет собой оболочку вокруг метода, который создаёт экземпляр контроллера и выполняет выбранный метод действия. Конечные точки создаются при старте приложения классом, который называется источник данных конечных точек методов действия контроллеров (Controller Action Endpoint Data Source). Он обходит все контроллеры и составляет список всех возможных конечных точек. Также он хранит коллекцию зарегистрированных маршрутов и может сопоставлять маршруты с конечными точками.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
День шестьсот пятьдесят второй. #ЗаметкиНаПолях
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация
Инициализация контроллера
Наконец запрос попадает во фреймворк MVC. Здесь под фреймворком понимается набор контроллеров с методами действий, фильтров и представлений Razor.
Для начала рассмотрим два важных класса.
Первый называется инициатором действий контроллера (Controller Action Invoker) и наследуется от второго абстрактного класса – инициатора ресурсов (Resource Invoker). Эти классы управляют конвейером MVC (см. картинку ниже). Делегат запроса в промежуточном ПО конечных точек передаёт данные контекста HTTP-запроса и выбранного метода действия в инициатор действий контроллера и его родительский класс. Логика инициатора ресурсов сначала выполняет фильтры авторизации, ресурсов и промежуточного ПО, чтобы понять, нужно ли вообще создавать контроллер. Если нужно, фабрика контроллеров, использует контекстные данные, предоставленные вызывающей стороной, для создания экземпляра контроллера. Затем инициируется поток исполнения соответствующего метода действия этого экземпляра контроллера. Когда метод действия возвращает результат, инициатор ресурсов выполняет результат для генерации ответа.
Фильтры
Фильтры - позволяют внедрять пользовательский код на различных этапах жизненного цикла запроса. MVC «из коробки» включает несколько встроенных фильтров, но мы также можем легко написать свои. Выполнение фильтров управляется инициатором действий контроллера, который вставляет их код в различные этапы конвейера MVC. Их место в жизненном цикле запроса определяется их типом:
1. Фильтры авторизации, ресурсов и промежуточного ПО выполняются перед созданием контроллера. То есть эти фильтры могут решить, должен ли запрос отправляться дальше по конвейеру или его следует прервать (например, при неудачной авторизации).
2. Фильтры действий и результатов действий запускаются до и после выполнения метода действия и результата соответственно.
3. Фильтры исключений могут выполняться в любом месте конвейера.
Фильтры постоянно добавлялись в MVC с ранних версий, поэтому в .NET Core 3 их довольно много. С фильтрами авторизации, действий и исключений всё более-менее понятно. Рассмотрим подробнее редко используемые фильтры ресурсов и промежуточного ПО.
Фильтры ресурсов реализуют интерфейс
Фильтры промежуточного ПО позволяют запускать стандартные компоненты промежуточного ПО внутри конвейера MVC. Есть две основные причины их использования:
- повторное использование логики компонента промежуточного ПО;
- предоставление компоненту промежуточного ПО большего объёма данных контекста изнутри MVC, чем это возможно на этапе выполнения промежуточного ПО.
Фильтры промежуточного ПО выполняются после фильтров авторизации, но на той же общей стадии, что и фильтры ресурсов.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация
Инициализация контроллера
Наконец запрос попадает во фреймворк MVC. Здесь под фреймворком понимается набор контроллеров с методами действий, фильтров и представлений Razor.
Для начала рассмотрим два важных класса.
Первый называется инициатором действий контроллера (Controller Action Invoker) и наследуется от второго абстрактного класса – инициатора ресурсов (Resource Invoker). Эти классы управляют конвейером MVC (см. картинку ниже). Делегат запроса в промежуточном ПО конечных точек передаёт данные контекста HTTP-запроса и выбранного метода действия в инициатор действий контроллера и его родительский класс. Логика инициатора ресурсов сначала выполняет фильтры авторизации, ресурсов и промежуточного ПО, чтобы понять, нужно ли вообще создавать контроллер. Если нужно, фабрика контроллеров, использует контекстные данные, предоставленные вызывающей стороной, для создания экземпляра контроллера. Затем инициируется поток исполнения соответствующего метода действия этого экземпляра контроллера. Когда метод действия возвращает результат, инициатор ресурсов выполняет результат для генерации ответа.
Фильтры
Фильтры - позволяют внедрять пользовательский код на различных этапах жизненного цикла запроса. MVC «из коробки» включает несколько встроенных фильтров, но мы также можем легко написать свои. Выполнение фильтров управляется инициатором действий контроллера, который вставляет их код в различные этапы конвейера MVC. Их место в жизненном цикле запроса определяется их типом:
1. Фильтры авторизации, ресурсов и промежуточного ПО выполняются перед созданием контроллера. То есть эти фильтры могут решить, должен ли запрос отправляться дальше по конвейеру или его следует прервать (например, при неудачной авторизации).
2. Фильтры действий и результатов действий запускаются до и после выполнения метода действия и результата соответственно.
3. Фильтры исключений могут выполняться в любом месте конвейера.
Фильтры постоянно добавлялись в MVC с ранних версий, поэтому в .NET Core 3 их довольно много. С фильтрами авторизации, действий и исключений всё более-менее понятно. Рассмотрим подробнее редко используемые фильтры ресурсов и промежуточного ПО.
Фильтры ресурсов реализуют интерфейс
IResourceFilter
, определяющий два метода OnResourceExecuting
и OnResourceExecuted
. Фильтры ресурсов уникальны тем, что они оборачивают выполнение большей части конвейера MVC. Это первое место для внедрения пользовательской логики после авторизации (OnResourceExecuting
) и последнее место перед тем, как MVC вернёт ответ (OnResourceExecuted
). В некотором смысле фильтры ресурсов похожи на промежуточное ПО внутри конвейера MVC. С их помощью можно выполнять кэширование или управлять поведением привязки модели.Фильтры промежуточного ПО позволяют запускать стандартные компоненты промежуточного ПО внутри конвейера MVC. Есть две основные причины их использования:
- повторное использование логики компонента промежуточного ПО;
- предоставление компоненту промежуточного ПО большего объёма данных контекста изнутри MVC, чем это возможно на этапе выполнения промежуточного ПО.
Фильтры промежуточного ПО выполняются после фильтров авторизации, но на той же общей стадии, что и фильтры ресурсов.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
👍1
День шестьсот пятьдесят третий. #ЗаметкиНаПолях
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация
Инициализация контроллера
Выполнение метода действия
Метод действия - это любой открытый метод контроллера, который действует как конечная точка обработки входящего запроса. Выполнение метода действия управляется инициатором действий контроллера. Перед выполнением метода действия выполняется привязка модели и фильтры действий, которые могут выполняться как до, так и после метода действия. Сам метод действия создает объект результата. Методы действий не генерируют напрямую ответ для браузера. Они отвечают за предоставление данных ответа и типа ответа. Ответственность за фактическую визуализацию этих данных ответа вынесена в объекты результата действия.
Привязка модели
Привязка модели - это процесс сопоставления данных входящего запроса с параметрами метода действия. Привязка модели использует данные из различных источников HTTP-запроса, таких как URL-адрес, данные формы, заголовки и т.д. Методы действия могут требовать в качестве параметров сложный тип или несколько простых типов. Параметры метода действия также могут влиять на то, какой метод выбирается для обработки запроса.
Процессом привязки модели изнутри управляют три компонента:
1. Провайдеры связывателей моделей (model binder providers) - решают, какой связыватель модели следует использовать для параметров выбранного метода действия.
2. Связыватель модели (model binder) - выполняет работу по заполнению параметров значениями. Существуют разные типы связывателей и провайдеров связывателей для обработки различных типов данных.
3. Провайдеры значений (value providers) - извлекают данные из входящего запроса и передают их связывателю модели во время процесса привязки.
Допустим, у нас есть входящий запрос на обновление продукта, который достигает стадии привязки модели (см. картинку ниже). Инициатор действий контроллера использует фабрику связывателей модели, которая последовательно перебирает все провайдеры связывателей модели, зарегистрированные в приложении. Каждый из этих провайдеров работает с разными типами данных, поэтому каждый проверяет, может ли он предоставить связыватель для заполнения параметров методов действия. В нашем случае встроенный провайдер сложных типов (Complex Provider), создаст связыватель для обработки сложного параметра типа Product. Стоит отметить, что используется первый же провайдер, который сможет предоставить связыватель. Затем связыватель сложных моделей (Complex Model Binder) использует доступные провайдеры значений для извлечения данных из запроса и создания экземпляра типа Product. Он также выполняет валидацию модели, чтобы убедиться, что значения приемлемы и соответствуют атрибутам валидации. После того, как параметры заполнены, они передаются методу действия.
Кроме того, существует два типа компонентов, которые могут предоставлять значения:
1. Провайдеры значений (value providers) предоставляют структурированные данные в виде пар ключ-значение из таких источников, как URL-адрес и данные формы.
2. Средства форматирования ввода (input formatters) обрабатывают более сложные данные тела запроса в стандартных форматах, таких как JSON или XML.
В зависимости от конфигурации приложения и метода действия процесс привязки модели может немного отличаться от приведённого. Также стоит отметить, что, хотя описанный процесс точен концептуально, фактический код не повторяет его дословно. Связывание модели - сложная система. MVC создаёт и кэширует множество различных внутренних компонентов в зависимости от варианта использования.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/
Жизненный цикл запроса в ASP.NET Core MVC 3. Продолжение
Начало
Промежуточное ПО
Маршрутизация
Инициализация контроллера
Выполнение метода действия
Метод действия - это любой открытый метод контроллера, который действует как конечная точка обработки входящего запроса. Выполнение метода действия управляется инициатором действий контроллера. Перед выполнением метода действия выполняется привязка модели и фильтры действий, которые могут выполняться как до, так и после метода действия. Сам метод действия создает объект результата. Методы действий не генерируют напрямую ответ для браузера. Они отвечают за предоставление данных ответа и типа ответа. Ответственность за фактическую визуализацию этих данных ответа вынесена в объекты результата действия.
Привязка модели
Привязка модели - это процесс сопоставления данных входящего запроса с параметрами метода действия. Привязка модели использует данные из различных источников HTTP-запроса, таких как URL-адрес, данные формы, заголовки и т.д. Методы действия могут требовать в качестве параметров сложный тип или несколько простых типов. Параметры метода действия также могут влиять на то, какой метод выбирается для обработки запроса.
Процессом привязки модели изнутри управляют три компонента:
1. Провайдеры связывателей моделей (model binder providers) - решают, какой связыватель модели следует использовать для параметров выбранного метода действия.
2. Связыватель модели (model binder) - выполняет работу по заполнению параметров значениями. Существуют разные типы связывателей и провайдеров связывателей для обработки различных типов данных.
3. Провайдеры значений (value providers) - извлекают данные из входящего запроса и передают их связывателю модели во время процесса привязки.
Допустим, у нас есть входящий запрос на обновление продукта, который достигает стадии привязки модели (см. картинку ниже). Инициатор действий контроллера использует фабрику связывателей модели, которая последовательно перебирает все провайдеры связывателей модели, зарегистрированные в приложении. Каждый из этих провайдеров работает с разными типами данных, поэтому каждый проверяет, может ли он предоставить связыватель для заполнения параметров методов действия. В нашем случае встроенный провайдер сложных типов (Complex Provider), создаст связыватель для обработки сложного параметра типа Product. Стоит отметить, что используется первый же провайдер, который сможет предоставить связыватель. Затем связыватель сложных моделей (Complex Model Binder) использует доступные провайдеры значений для извлечения данных из запроса и создания экземпляра типа Product. Он также выполняет валидацию модели, чтобы убедиться, что значения приемлемы и соответствуют атрибутам валидации. После того, как параметры заполнены, они передаются методу действия.
Кроме того, существует два типа компонентов, которые могут предоставлять значения:
1. Провайдеры значений (value providers) предоставляют структурированные данные в виде пар ключ-значение из таких источников, как URL-адрес и данные формы.
2. Средства форматирования ввода (input formatters) обрабатывают более сложные данные тела запроса в стандартных форматах, таких как JSON или XML.
В зависимости от конфигурации приложения и метода действия процесс привязки модели может немного отличаться от приведённого. Также стоит отметить, что, хотя описанный процесс точен концептуально, фактический код не повторяет его дословно. Связывание модели - сложная система. MVC создаёт и кэширует множество различных внутренних компонентов в зависимости от варианта использования.
Продолжение следует…
Источник: https://app.pluralsight.com/library/courses/aspnet-core-3-mvc-request-life-cycle/