TLDR: Переместите action методы из контроллеров в лениво загружаемые команды с помощью паттерна «Ленивая команда».

При написании контроллеров в ASP.NET Core, Вы можете столкнуться с очень длинным классом, если не будете осторожны. Представим, что Вы  написали несколько action методов в контроллере, по несколько строк кода в каждом, и прокомментировали их для поддержки Swagger.

Например:

Паттерн «Ленивая команда»

Именно здесь и может быть полезен паттерн «Ленивая команда». Паттерн перемещает логику из каждого action метода и вводит зависимости в свой собственный класс.

Вся логика и зависимости в контроллерах перемещаются в команду, котоорая имеет теперь одну ответственность. Теперь у контроллера другой набор зависимостей и он лениво создаёт команду для каждого запроса.

Возможно, Вы заметили интерфейс IAsyncCommand. У меня их имеется 4 штуки, каждый со своим набором параметров (от 0 до 3). Все они описывают метод ExecuteAsync для выполнения команды и возвращают IActionResult. Я лично считаю, что если Вам нужно передавать более 3 параметров, для этого вы можете использовать класс для представления своих параметров.

 

Почему Lazy?

Почему мы используем Lazy<T>? Ответ заключается в том, что если у нас есть несколько action методов в нашем контроллере, мы не хотим создавать экземпляры зависимостей для каждого action метода, если мы планируем использовать только один. Для регистрации наших Lazy команд требуется немного дополнительной работы в Startup.cs. Мы можем регистрировать ленивые зависимости так:

HttpContext и ActionContext

Теперь Вы можете подумать, как получить доступ к HttpContext или ActionContext, для, например, установки HTTP заголовка? Для этой цели мы можем использовать интерфейсы IHttpContextAccessor и IActionContextAccessor

Обратите, что они могут быть зарегистрированы, как singleton. Затем, Вы можете ииспользовать их для получения объектов HttpContext или ActionContext для текущего HTTP-запроса. Вот простой пример:

 

Unit тестирование

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

Источник

Также рекомендую ознакомиться со статьей Паттерн проектирования Посредник (Mediator) на C#

P.S. Присоединяйся в любой удобной для тебя социальной сети. Для меня очень важно оставаться с тобой на связи, ведь у меня есть еще много полезной информации о программировании для тебя, которой я хочу с тобой поделиться.

Вконтакте
Telegram
Facebook
Twitter
Одноклассники
Дзен
Google+

 

 
×
%d такие блоггеры, как: