Partilhar via


IActionContextAccessor e ActionContextAccessor estão obsoletos

IActionContextAccessor e ActionContextAccessor foram marcados como obsoletos com ID ASPDEPR006de diagnóstico . Com a introdução do roteamento de pontos finais, não é mais necessário, IActionContextAccessor pois os desenvolvedores podem acessar informações sobre descritores de ações e metadados diretamente através HttpContext.GetEndpoint()do .

Versão introduzida

.NET 10 Prévia 7

Comportamento anterior

Anteriormente, você podia usar IActionContextAccessor para acessar o atual ActionContext:

public class MyService
{
   private readonly IActionContextAccessor _actionContextAccessor;

   public MyService(IActionContextAccessor actionContextAccessor)
   {
       _actionContextAccessor = actionContextAccessor;
   }

   public void DoSomething()
   {
       var actionContext = _actionContextAccessor.ActionContext;
       var actionDescriptor = actionContext?.ActionDescriptor;
       // Use action descriptor metadata.
   }
}

Novo comportamento

A partir do .NET 10, usando IActionContextAccessor e ActionContextAccessor produzindo um aviso do compilador com ID ASPDEPR006de diagnóstico:

aviso ASPDEPR006: ActionContextAccessor está obsoleto e será removido em uma versão futura. Para mais informações, visite https://aka.ms/aspnet/deprecate/006.

Tipo de mudança disruptiva

Essa alteração pode afetar compatibilidade da fonte.

Motivo da mudança

Com a introdução do roteamento de ponto final no ASP.NET Core, IActionContextAccessor não é mais necessário. A infraestrutura de roteamento de ponto de extremidade fornece uma maneira mais limpa e direta de acessar metadados de ponto de extremidade por meio HttpContext.GetEndpoint()do , alinhando-se com a evolução arquitetônica do ASP.NET Core em direção ao roteamento de pontos finais.

Migrar de IActionContextAccessor e IHttpContextAccessor usar HttpContext.GetEndpoint():

Antes:

public class MyService
{
   private readonly IActionContextAccessor _actionContextAccessor;

   public MyService(IActionContextAccessor actionContextAccessor)
   {
       _actionContextAccessor = actionContextAccessor;
   }

   public void DoSomething()
   {
       var actionContext = _actionContextAccessor.ActionContext;
       var actionDescriptor = actionContext?.ActionDescriptor;
       // Use action descriptor metadata
   }
}

Depois:

public class MyService
{
   private readonly IHttpContextAccessor _httpContextAccessor;

   public MyService(IHttpContextAccessor httpContextAccessor)
   {
       _httpContextAccessor = httpContextAccessor;
   }

   public void DoSomething()
   {
       var httpContext = _httpContextAccessor.HttpContext;
       var endpoint = httpContext?.GetEndpoint();
       var actionDescriptor = endpoint?.Metadata.GetMetadata<ActionDescriptor>();
       // Use action descriptor metadata.
   }
}

APIs afetadas