.NET + Design Patterns na prática: middlewares e o padrão Chain of Responsibility
Em uma live recente no Canal .NET sobre a utilização de Design Patterns em .NET abordei a implementação de Middlewares com o ASP.NET Core, enfatizando como essas estruturas representam um elemento arquitetural central dentro da plataforma.
A gravação está disponível no YouTube e pode ser assistida gratuitamente (clique neste link):
O diagrama a seguir (obtido da própria documentação do ASP.NET Core) ilustra bem a importância dos Middlewares, com toda requisição que chega a uma Web App passando por uma pilha/stack de execução composta por estes elementos:
E temos na implementação deste tipo de construção tão fundamental ao ASP.NET Core uma variação de uso de um padrão de projeto: trata-se do pattern Chain of Responsibility, também conhecido Chain of Command. Este pattern inclusive integra inclusive o grupo dos 23 padrões conhecidos como Gang of Four patterns, sendo classificado como do tipo Comportamental (Behavioral).
O funcionamento desse pattern envolve a execução encadeada de Handlers, algo que se encaixa muito bem no tratamento de solicitações HTTP em plataformas Web como o ASP.NET Core. Cada Middleware corresponderá então a um Handler dentro deste padrão.
Uma requisição HTTP recebida por uma aplicação ASP.NET Core passará pela pilha de Middlewares, sendo que um middleware pode ou não repassar o processamento para o próximo componente na stack. Este processo se repete até atingir o endpoint em questão (que pode ser uma Action em um Controller dentro de um projeto do tipo Web API).
Analisando este código podemos observar:
- Uma instância do tipo RequestDelegate permite delegar o processamento para o próximo Middleware da pilha (linha 62) ou não;
- Para determinar se a requisição acontece dentro de um período de indisponibilizada é feita uma consulta a uma tabela em uma base de dados (que pode ser do SQL Server ou SQLite).
Já a classe ChecagemIndisponibilidadeExtensions conta com os Extension Methods:
- ConfigureChecagemIndisponibilidade, utilizado para configurar o Middleware de indisponibilidade;
- UseChecagemIndisponibilidade, ativa o uso do Middleware de indisponibilidade.
A listagem a seguir traz o Middleware de indisponibilidade sendo ativado para uma API REST de contagem de acessos, com chamadas aos métodos ConfigureChecagemIndisponibilidade (linha 5) e UseChecagemIndisponibilidade (linha 18):
O código deste projeto foi disponibilizado no GitHub:
https://github.com/renatogroffe/DotNet6-ClassLib-ASPNETCore_MiddlewareIndisponibilidade
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!