Sdílet prostřednictvím


IActionContextAccessor a ActionContextAccessor jsou zastaralé

IActionContextAccessor a ActionContextAccessor byly označeny jako zastaralé pod diagnostickým ID ASPDEPR006. Se zavedením směrování koncových bodů už IActionContextAccessor není nutné, protože vývojáři mohou přistupovat k popisovači akcí a informacím o metadatech přímo prostřednictvím HttpContext.GetEndpoint().

Verze byla představena

.NET 10 Preview 7

Předchozí chování

Dříve jste mohli použít IActionContextAccessor k přístupu k aktuálnímu 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.
   }
}

Nové chování

Od verze .NET 10 použití IActionContextAccessor a ActionContextAccessor vygeneruje upozornění kompilátoru s diagnostickým ID ASPDEPR006:

upozornění ASPDEPR006: ActionContextAccessor je zastaralý a bude odebrán v budoucí verzi. Další informace najdete na adrese https://aka.ms/aspnet/deprecate/006.

Typ zásadní změny

Tato změna může ovlivnit kompatibilitu zdroje.

Důvod změny

Se zavedením směrování koncových bodů v ASP.NET Core IActionContextAccessor už není potřeba. Infrastruktura směrování koncového bodu poskytuje čistší a přímější způsob přístupu k metadatům koncových bodů prostřednictvím HttpContext.GetEndpoint(), což je v souladu s vývojem architektury ASP.NET Core směrem ke směrování koncových bodů.

Migrace z IActionContextAccessor na IHttpContextAccessor a použití HttpContext.GetEndpoint()

Před:

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
   }
}

Po:

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

Ovlivněná rozhraní API