.NET + Design Patterns na prática: middlewares e o padrão Chain of Responsibility

Renato Groffe
2 min readOct 24, 2022

--

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:

Fonte: Documentação do ASP.NET Core

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!

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker