.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:


José Carlos Macoratti