Compartilhar via


IActionContextAccessor e ActionContextAccessor estão obsoletos

IActionContextAccessor e ActionContextAccessor foram marcados como obsoletos com a ID de diagnóstico ASPDEPR006. Com a introdução do roteamento de ponto de extremidade, IActionContextAccessor não é mais necessário, pois os desenvolvedores podem acessar informações de descritor de ação e metadados diretamente por meio HttpContext.GetEndpoint().

Versão introduzida

.NET 10 Versão Prévia 7

Comportamento anterior

Anteriormente, você poderia 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

Começando no .NET 10, usando IActionContextAccessor e ActionContextAccessor produz um aviso do compilador com a ID ASPDEPR006 de diagnóstico:

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

Tipo de mudança disruptiva

Essa alteração pode afetar a compatibilidade da origem.

Motivo da alteração

Com a introdução do roteamento de ponto de extremidade 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, HttpContext.GetEndpoint()alinhando-se com a evolução arquitetônica do ASP.NET Core em direção ao roteamento de ponto de extremidade.

Migrar de IActionContextAccessor para IHttpContextAccessor e 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