.NET 7 - Actions do Controller e inferência de parâmetros DI
Hoje veremos o novo comportamento das Actions nos Controllers das APIs que agora tentam inferir os parâmetros a partir do contêiner DI. |
O mecanismo para inferir fontes de vinculação de parâmetros de uma Action do controlador nas APIs na plataforma .NET agora marca os parâmetros a serem vinculados a patir do contêiner de injeção de dependência (DI) quando o tipo é registrado no contêiner.
Em casos raros, isso pode quebrar aplicativos que possuem um tipo de DI que também é aceito nos métodos Action do controlador de uma API.
Comportamento anterior
Se você desejava vincular um tipo registrado no contêiner DI, ele deveria ser
explicitamente decorado usando um atributo que implementasse
IFromServiceMetadata, como FromServicesAttribute:
1- Registro do serviço
... Services.AddScoped<SomeCustomType>(); ... |
2- Utilização
[Route("[controller]")] [ApiController] public class MyController : ControllerBase { public ActionResult Get([FromServices] SomeCustomType service) => Ok(); } |
Se o atributo não fosse especificado, o parâmetro seria resolvido a partir do Body do Request (corpo da solicitação) enviada pelo cliente:
[Route("[controller]")] [ApiController] public class MyController : ControllerBase { //Faz a vinculação a partir do body do Request [HttpPost] public ActionResult Post(SomeCustomType service) => Ok(); } |
Novo Comportamento
Os tipos
registrados no contêiner DI agora são
verificados na inicialização do aplicativo usando
IServiceProviderIsService para determinar se um argumento em uma Action
de um controlador da API vem do DI ou de outras fontes.
O exemplo a seguir, supõe que você sta usando o contêiner de DI padrão,
onde o serviço
SomeCustomType vem do contêiner de DI:
1- Registro do serviço
... Services.AddScoped<SomeCustomType>(); ... |
2- Utilização
[Route("[controller]")] [ApiController] public class MyController : ControllerBase { //Faz a vinculação do DI [HttpPost] public ActionResult Post(SomeCustomType service) => Ok(); } |
O mecanismo para inferir as fontes de vinculação dos parâmetros nas Actions do controlador da API segue as seguintes regras:
Esse mesmo
comportamento já está implementado nas minimal APIs.
A probabilidade de quebrar aplicativos é baixa, pois não é comum ter um tipo em
um contêiner
DI e como argumento em sua Action do controlador de API ao mesmo tempo.
E estamos conversados.
"Ele(Jesus)
respondeu: "Cuidado para não serem enganados. Pois muitos virão em meu nome,
dizendo: ‘Sou eu! ’ e ‘o tempo está próximo’. Não os sigam."
Lucas 21:8
Referências: